A - Plus One on the Subset
题意:给定一个数组,你每次可以选择任意位置任意数量的数字加1,问需要几次能把数组所有的元素变成同样大小。
题解:最小的元素变成最大的元素的次数就是答案,其他的元素在这个过程中就也能变成最大的。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<bits/stdc++.h> using namespace std;
#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 2e5;
int main() { #ifndef ONLINE_JUDGE freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); #endif IOS;
int T; cin>>T; while(T--) { int n; cin>>n; int maxx = -inf, minn = inf; for(int i = 0; i < n; i++) { int x; cin>>x; maxx = max(maxx, x); minn = min(minn, x); } cout<<maxx-minn<<endl; }
return 0; }
|
B - Make AP
题意:给定三个数,你可以任意选择一个,乘以m(m > 0),如果操作之后的序列满足等差数列,输出 YES,否则输出 NO。
题解:分类讨论一下即可,注意乘以 m之后的那个数要大于0
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include<bits/stdc++.h> using namespace std;
#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 2e5;
int main() { #ifndef ONLINE_JUDGE freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); #endif IOS;
int T; cin>>T; while(T--) { ll a, b, c; cin>>a>>b>>c; ll d1 = c - a; if((c-a)%2 == 0) { ll bb = a + (c-a)/2; if(bb%b == 0 && bb > 0) { cout<<"YES"<<endl; continue; } } ll d2 = c - b; ll aa = b - (c-b); if(aa%a == 0 && aa > 0) { cout<<"YES"<<endl; continue; } ll d3 = b - a; ll cc = b+(b-a); if(cc%c == 0 && cc > 0) { cout<<"YES"<<endl; continue; } cout<<"NO"<<endl; }
return 0; }
|
C - Division by Two and Permutation
题意:给定一个长度为 n的数组,你可以任意次将数组中的数除以2(向下取整),如果数组元素可以变成 1 2 3 … n,输出YES,否则输出NO。
题解:先把大于 n的数,向下取整直到小于等于 n。用 map先记录此时数组每个元素对应的
1到 n。然后从大往小遍历,如果数 x对应的 mp[x]大于1,x用一个,把多余的分给 x/2。(具体看代码)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include<bits/stdc++.h> using namespace std;
#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 50;
int a[N], vis[N]; map<int, int> mp;
int main() { #ifndef ONLINE_JUDGE freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); #endif IOS;
int T; cin>>T; while(T--) { int n; cin>>n; int cnt = 0; mp.clear(); memset(vis, 0,sizeof vis); for(int i = 0; i < n; i++) { cin>>a[i]; while(a[i] > n) a[i]>>=1; mp[a[i]]++; } for(int i = n; i >= 1; i--) { while(mp[i] > 1) { mp[i]--; mp[i/2]++; } } bool flag = 0; for(int i = 1; i <= n; i++) { if(mp[i] == 0) { flag = 1; break; } } if(flag) cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }
|
D - Palindromes Coloring
题意:给定一个字符串,k种颜色,然后给字符串染色。每种颜色至少用 1次,但可以不把所有字符都染色。染色之后把相同颜色的字符当作一组,可以组内任意交换位置,保证每组都为回文串。求长度最短的一组的最大长度(尽可能保证均分就长度最大。
题解:统计一下一共有几对相同的字符。然后均分给 k组,然后统计剩余的单个字符个数(包括没用到的成对字符),如果大于 k,就每组都再分一个字符(放中间还是回文串)。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<bits/stdc++.h> using namespace std;
#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 50;
map<char, int> mp, vis;
int main() { #ifndef ONLINE_JUDGE freopen("in.in", "r", stdin); freopen("out.out", "w", stdout); #endif IOS;
int T; cin>>T; while(T--) { int n, k; cin>>n>>k; string s; cin>>s; mp.clear(); vis.clear(); int len = s.size(); for(int i = 0; i < len; i++) mp[s[i]]++; int ans = 0; for(int i = 0; i < len; i++) { if(!vis[s[i]]) { vis[s[i]] = 1; ans += mp[s[i]]/2; } } int cnt = len-(ans - ans%k)*2; if(cnt >= k) cout<<(ans/k)*2+1<<endl; else cout<<(ans/k)*2<<endl; } return 0; }
|
E - Masha-forgetful
先占个坑一会码)
F - Interacdive Problem
先占个坑一会码)
G - MinOr Tree
先占个坑一会码)