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