2020 年百度之星·程序设计大赛 - 初赛二-------Car

Problem Description
W 市最近面临了严重的交通拥堵问题,现在决定要在工作日(周一到周五)限号。 每天可以限制若干尾号的车辆,譬如说周一限尾号为 0 的车,周二限尾号为 1,2 的车。

每个尾号在五天当中最多只能被限一次,一天也可以什么牌照都不限。

我们要设置一个容量上限 mm,使得至少存在一种方案,每一天不被限号的车的总数都小于等于 mm。

请求出最小的 mm。

Input
第一行一个整数 test(1 \leq test \leq 10)test(1≤test≤10) 表示数据组数。

对于每组数据,第一行一个正整数 n(1 \leq n \leq 10000)n(1≤n≤10000) 表示这个城市里有多少辆车。

接下来 nn 行,每行一个字符串表示车牌。车牌由 5 位字符构成,每位都是’0’-'9’的数字。两辆车的车牌可能相同。

Output
对于每组数据,一行一个整数表示答案。

Sample Input
2
1
00000
10
00000
00001
00002
00003
00004
00005
00006
00007
00008
00009
Sample Output
1
8
这个直接用深搜即可,从车尾号开始搜.
这个题是求m,使得每一天不被限号的车的总数都小于等于 m。其实就是求出所有可能的方案,要一个m最小的方案。首先判断有多少种方案,我们以车尾号划分,每一个尾号都有五种可能,所以总的方案数就是5^10,然后我们用深搜来实现。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int maxn =1e9;
ll a[10],b[10];
ll ans;
void bfs(ll x)
{
    ll i;
    if(x==10)
    {
        ll d=0;
        for(i=1;i<=5;i++)/*这一个是记录这五天里通过的车辆数最多的一天*/
        {
            d=max(d,b[i]);
        }
        ans=min(ans,d);
        return ;
    }
    for(i=1;i<=5;i++)/*这一段就是体现了每一种尾号有五种可能,
    他就可以跑完所有的可能。*/
    {
        b[i]-=a[x];
        bfs(x+1);
        b[i]+=a[x];
    }

}
int main()
{
    ll t,n,i;
    scanf("%lld",&t);
    while(t--)
    {
        memset(a,0,sizeof(a));
        scanf("%lld",&n);
        ll x;
        ans=maxn;
        for(i=0;i<n;i++)
        {
            scanf("%lld",&x);
            a[x%10]++;
        }
        ll sum=0;
        for(i=0;i<10;i++)
        {
            sum+=a[i];
        }
        for(i=0;i<10;i++)/*这个b数组是存的所有车辆的个数,因为如
        果这一天不限号,那么这一天它通过的车俩数就是所有的*/
        b[i]=sum;
        bfs(0);
            printf("%lld\n",ans);
    }


}

你可能感兴趣的:(题目解析)