A - Juggling Letters
题意:给你n个字符串,可以重新组合排列,问能不能凑出来n个完全一样的字符串。
思路:只要能每一种字母的个数能被n整除,也就是能平分成n份就可以了。
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<map> #include<vector> using namespace std; typedef long long ll; int a[26]; int main() { ll t; cin>>t; while(t--) { memset(a,0,sizeof(a)); int n; cin>>n; string s; for(int i = 0;i < n;i++) { cin>>s; for(int j = 0;j < s.length();j++) { a[s[j]-'a']++; } } int flag = 1; for(int i = 0;i < 26;i++) { if(a[i]%n!=0) flag = 0; } if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }
B - Power Sequence
题意:给你个数列,你可以调换顺序,或者数据,每一次加一都会花费1,求让它变成c的i次方最小花费的c。
思路:暴力枚举c。
#include<bits/stdc++.h> using namespace std; long long fastPower(long long base,long long power) { long long res = 1; while(power) { if(power%2==1) { res = res*base; } power/=2; base = base*base; } if(base == 0) return 0; return res; }//快速幂没用上 int main() { int n; cin>>n; int a[n+1]; int i; long long ans,t; long long res = 1e18; for(i = 0;i < n;i++)cin>>a[i]; sort(a,a+n); for(int c = 1;;c++) { long long sum = 0 ,t = 1; for(i = 0;i < n;i++) { sum+=abs(a[i]-t); t = t*c; if(t>=1e15) { t = -1; break; } } if(t==-1) { break; } else res = min(res,sum); } cout<<res<<endl; }
D - Drinks Choosing
题意:n个人,k套饮料瓶子,一个瓶子能装两瓶同种饮料,问最多能给多少人喝到自己喜欢的饮料。
思路:先就着偶数人的人喝,如果还剩再给奇数,因为奇数的人肯定会浪费一个瓶子。
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<map> #include<vector> using namespace std; typedef long long ll; int a[1001]; bool cmp(int a,int b) { return a>b; } int main() { int n,k; cin>>n>>k; int num;//盒的数量 if(n%2==0) num = n/2; else num = n/2+1; int i; for(i = 0; i < n; i++) { int t; cin>>t; a[t]++; } sort(a+1,a+k+1,cmp); int cnt = 0; for(int i = 1; i<=k; i++) { if(a[i]%2==0&&a[i]!=0) { while(a[i]>0&&num>0) { num--; cnt+=2; a[i]-=2; } } else if(a[i]%2!=0&&a[i]!=0) { while(a[i]>1&&num>0) { num--; cnt+=2; a[i]-=2; } } } cout<<cnt+num<<endl; }
E - Sport Mafia
题意:先放一个糖在盒子里,然后可以进行两种操作:一是吃掉一个糖,二是往盒子里放糖,每次放的糖要比上次多,问n此操作之后能吃多少糖。
思路:二元一次方程组,设x是操作一,y是操作二可以得到:
x+y = n;y(y+1)/2-x = k;
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<set> #include<map> #include<vector> using namespace std; typedef long long ll; int a[1001]; bool cmp(int a,int b) { return a>b; } int main() { ll n,k; cin>>n>>k; ll delta = (2*n+3)*(2*n+3)-4*(n*n+n-2*k); ll res = ((2*n+3)-sqrt(delta))/2; cout<<res<<endl; }