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’的数字。两辆车的车牌可能相同。
【2020 年百度之星·程序设计大赛 - 初赛二-------Car】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

    推荐阅读