Codeforces Round #603 (Div. 2)
A. Sweet Problem
简单题,排个序判断a+b与c的关系,<就是a+b>是(a+b+c)/2
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; ll a[3]; int main() { int t; scanf("%d",&t); for(int i=1;i<=t;++i) { scanf("%d%d%d",&a[0],&a[1],&a[2]); sort(a,a+3); ll ans=0; if(a[0]+a[1]<=a[2])ans=a[0]+a[1]; else ans+=a[2]+(a[0]+a[1]-a[2])/2; printf("%lld\n",ans); } return 0; }
B. PIN Codes
简单题,将不超过10个相同的数改动最少位使之全部不同。显然即使10个相同最多也只用改变一位,用桶排序判断该数出现次数,改变数字随便遍历一位求解即可。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; int a[100]; int b[10000]; int main() { int t; scanf("%d",&t); while(t--) { memset(b,0,sizeof(b)); int n; scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d",&a[i]); b[a[i]]++; } int ans=0; for(int i=0;i<10000;++i) { if(b[i]>1)ans+=b[i]-1; } printf("%d\n",ans); for(int i=1;i<=n;++i) { if(b[a[i]]==1)printf("%04d\n",a[i]); else { for(int j=1;j<=9;++j) { if(a[i]%10+j>9) { if(b[a[i]+j-10]==0) { printf("%04d\n",a[i]+j-10); b[a[i]+j-10]=1; break; } } else { if(b[a[i]+j]==0) { printf("%04d\n",a[i]+j); b[a[i]+j]=1; break; } } } b[a[i]]--; } } } return 0; }
C. Everyone is a Winner!
题意是让你输出n除以n+1到1的数,输出不重复的数字。数据范围给到了1e9,写了一个直接模拟的做法,可以发现sqrt(n)之前的数一定不同。所以可以直接输出0-sqrt(n)的数,后面的在模拟即可。复杂度降到O(sqrt(n))。统计个数的时候最初用了sqrt(n)*2。发现会有一点误差。所以是模拟算了一遍在输出。
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+5; int a[100]; int b[10000]; int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); int p=-1; int ans=sqrt(n)+1; for(int i=sqrt(n);i>=1;--i) { if(n/i==i)continue; ans++; } printf("%d\n0",ans); for(int i=1;i<=sqrt(n);++i)printf(" %d",i); for(int i=sqrt(n);i>=1;--i) { if(n/i==i)continue; printf(" %d",(n/i)); } printf("\n"); } return 0; }
D. Secret Passwords
题意是给出若干组字符串,不同组字符串如果有相同元素,就可以合并起来,求合并后还剩几组。应该是并查集的题目。由题意可知最多也只有26组。对于每组数据都让他们向最小的字母合并,最后判断该字母有没有出现和并查集等于自身的个数即可
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e6+5; char s[N]; int b[30]; int f[30]; int c[30]; int main() { int n; scanf("%d",&n); for(int i=0;i<30;++i)f[i]=i; for(int i=1;i<=n;++i) { scanf("%s",s); int len=strlen(s); for(int i=0;i<26;++i)b[i]=0; for(int j=0;j<len;++j) { b[s[j]-'a']++; c[s[j]-'a']++; } int flag=0; int t=0; for(int i=0;i<26;++i) { if(b[i]) { if(flag==0) { flag=1; t=i; } else { f[i]=t; } } } } int ans=0; for(int i=0;i<26;++i)if(c[i])ans++; for(int i=0;i<26;++i) { if(c[i]&&f[i]!=i)ans--; } printf("%d\n",ans); return 0; }