计蒜客初赛5

时间:2021-10-12 00:36:32

开打了计蒜客的比赛,这次题目难度不大,就是有点坑点,拼点细心与手速,最终晋级的题也提到了三题。

一开始,a思路挺顺,就是有点大意,忽略了两个细节,wa了两发,奔着300+就去了,心态有点方

不过b题跑成功后,发现c的数据并没有卡掉我的程序,于是一起拿下,成功晋级


 A. UCloud 机房的网络搭建


思路:这就是最基础的贪心,每次选连接数最多的分线器,一个排序,加个判断,impossible的特殊判断即可

最后就是一定要注意特殊值,0主机不用进循环直接输出,单独考虑(WA掉)。然而,到此,一定要冷静,因为1主机其实也不用进循环(再次WA掉)


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

const int maxn = 110;

int a[maxn];

bool cmp(const int a,const int b)
{
return a>b;
}

int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<m;i++)
{
scanf("%d",&a[i]);
}
if(n==0||n==1)
{
printf("%d\n",0);
continue;
}
int sum = 1;
sort(a,a+m,cmp);
int t;
for(t=0;t<m;t++)
{
sum += a[t] - 1;
if(sum >= n)
{
printf("%d\n",t+1);
break;
}
}
if(t==m)
{
printf("Impossible\n");
}
}
return 0;
}




B/C. UCloud 的安全秘钥(简单/中等)


思路:这题由于题目说是以数字出现次数作为评判标准,那么当然以数组记录出现次数,然后遍历一遍数字串进行判断,O(m*(k+n))的时间复杂度,直接过了b和c两题,一开始还有点不太相信,算了几遍时间,确定没问题后,成功晋级


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

const int maxn = 50010;

int s[maxn];

int collect[maxn];

int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
int m;
scanf("%d",&m);
while(m--)
{
memset(collect,0,sizeof(collect));
int k;
scanf("%d",&k);
for(int i=0;i<k;i++)
{
int temp;
scanf("%d",&temp);
collect[temp]++;
}
int wrong = 0;
int sum = 0;
for(int i=0;i<k;i++)
{
collect[s[i]]--;
if(collect[s[i]]<0)
{
wrong ++;
}
}
if(wrong == 0)
{
sum++;
}
for(int i=0;i<n-k;i++)
{
collect[s[k+i]]--;
if(collect[s[k+i]]<0)
{
wrong ++;
}
collect[s[i]]++;
if(collect[s[i]]<=0)
{
wrong--;
}
if(wrong == 0)
{
sum++;
}
}
printf("%d\n",sum);
}
}
return 0;
}