D - Danganronpa
题意:
给你有n种礼物,第i种有ai个。现在要把这些礼物分给一排同学,要求每个人发普通礼物和神秘礼物各一个,要求相邻两人的普通礼物不能为同一种,神秘礼物没有限制,普通礼物和神秘礼物都从这n个礼物中选取。问最多能发给多少人。
题解:
找出礼物最多的个数 A ,将其余不是A的礼物间隔放置,在有间隔的地方,放下礼物A,若A足都多,可以将间隔全部放满,则最多可发给 (sum-A)+(sum-A+1) 个人(sum为礼物的总个数),否则,最多能发给sum/2个人,然后比较取两个数的最小值
代码:
#include "iostream"
#include "algorithm"
#include "cstring"
#define maxn 1000005
using namespace std;
int a[maxn];
int main(){
int T;
cin>>T;
for(int t=1;t<=T;t++){
memset(a,0,sizeof(a));
int n;
long long sum=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
cout<<"Case #"<<t<<":";
sort(a,a+n);
cout<<" "<<min(sum/2,(sum-a[0])*2+1)<<endl;
}
return 0;
}
K - Lweb and String
题意:
求不同的字母个数即可
ps:
1.开始一直以为求的是最长上升子序列
2.该代码开始并未用 n 代替 strlen(a), 导致一直超时【可能是因为循环了n次,每次都要计算a的长度导致
代码:
#include "iostream"
#include "algorithm"
#include "cstring"
#include "cstdio"
#define maxn 100005
using namespace std;
char a[maxn];
int d[26];
int main(){
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++){
memset(d,0,sizeof(d));
int len=0;
scanf("%s",a);
int n=strlen(a);
for(int i=0;i<n;i++){
if(d[a[i]-'a']==0){
len++;
d[a[i]-'a']++;
}
}
printf("Case #%d: %d\n",t,len);
}
return 0;
}
A - A water problem
题意:
询问一个数是否可以同时整除73和137
题解:
可以用 n 分别对 73 和 137 取模,也可以用 n 对 10001 取模(10001为73和137的最小公倍数)
代码:
#include "iostream"
#include "cstdio"
#include "cstring"
using namespace std;
char s[10000005];
int main(){
int t=1;
while(scanf("%s",s)!=EOF){
int len=strlen(s);
int ans=0;
for(int i=0;i<len;i++)
ans=(int)(((long long)ans*10+s[i]-'0')%10001);
if(!ans)
printf("Case #%d: YES\n",t);
else
printf("Case #%d: NO\n",t);
t++;
}
return 0;
}