CodeForces Round#638 div2
作者:互联网
contest1348
2020-05-11
A.Puzzle Pieces
最后一位数大于前面所有数字的和,因此最后一位和1到n-1位数为一组,剩下为另一组,贪心即可。
#include <iostream> #include<queue> #include<map> #include<utility> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<stdio.h> #include<sstream> #include<fstream> #include<cmath> #include<math.h> using namespace std; typedef long long ll; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! typedef pair<int, int> P; unsigned int m, n, t,f,w,x; map<P, vector<int> > mapp ; long long dat[31] = {}; void solve() { cin >> m; ll ans = dat[m]; for (int i = m - 1; i >= m / 2; i--) ans -= dat[i]; for (int i = 1; i < m / 2; i++) ans += dat[i]; cout << ans << endl; } int main() { dat[0] = 1; for (int i = 1; i <= 30; i++) { dat[i] = dat[i - 1] * 2; } cin >> t; for (int i = 0; i < t; i++) { solve(); } return 0; }
B.Phoenix and Beauty
这题被卡了好久(剩下的看都没看)
每个长度为n的子列和相等==每个子列都有相同的元素==我们要构造出一个循环节为n的序列
如果给定的序列不同元素个数大于n,说明肯定不可能构造出这样的序列,直接输出-1
如果给定序列不同元素个数小于n,我们可以随便补个数字构造循环节
构造完之后,输出m次(m等于输入的序列长度),那么每个输入的数都可以在循环节中找到自己对应的位置
使用set维护不同的元素
C. Phoenix and Distribution
题目:将给定字符串分为k个字符串,求如何分令最大字符串字典序最小(可以不按顺序)
先给输入的排序
如果最小的字符小于k个,那么最大字串直接就是s[k-1],s[k-1]之后的所有字符可以分配给其他字符串
最小字符个数>=k,前k个都一样,平均分配,如果后面的元素也一样,依旧平均分配,若不同,则全部分配到一个子列中
#include <iostream> #include<queue> #include<map> #include<utility> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<stdio.h> #include<sstream> #include<fstream> #include<cmath> #include<set> #include<math.h> using namespace std; typedef long long ll; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! typedef pair<int, int> P; int m, n, t,f,w,x; int dat[10000+105] = {}; int cnt[26] = {}; set<int> s; void solve() { memset(cnt, 0, sizeof(cnt)); s = set<int>(); cin >> m >> n; string temp; cin >> temp; sort(temp.begin(), temp.end()); if (temp[0] != temp[n - 1]) cout << temp[n - 1]; else { cout << temp[n - 1]; if (temp[m - 1] == temp[n]) for (int i = 0; i < (m - 1) / n; ++i) { cout << temp[n]; } else for (int i = n; i < m; i++) cout << temp[i]; } printf("\n"); } int main() { cin >> t; for(int i = 0; i < t; ++i) { solve(); } return 0; }
D. Phoenix and Science
假设s[i]是第i天的细菌个数,那么s[0]到s[i]的和就是前i天的细菌质量的总和 s[0]=1
先以最大速度分裂,那么如果在某一天总质量为加上当天的大与了需要的质量,删去当天的,然后插入一个为质量为n-s的节点
排序,最后输出差分数组即可
#include <iostream> #include<queue> #include<map> #include<utility> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<stdio.h> #include<sstream> #include<fstream> #include<cmath> #include<set> #include<math.h> using namespace std; typedef long long ll; //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! typedef pair<int, int> P; int m, n, t,f,w,x; int dat[10000+105] = {}; int cnt[26] = {}; vector<int> s; void solve() { s = vector<int>(); s.push_back(1); cin >> n; ll ans = 1; ll t = 1; while (1) { t *= 2; if ((ans + t) == n) { s.push_back(t); break; } if (ans + t > n) { s.push_back(n - ans); break; } ans += t; s.push_back(t); } sort(s.begin(), s.end()); cout << s.size()-1 << endl; for (int i = 1; i < s.size(); ++i) cout << s[i]-s[i-1] << ' '; printf("\n"); } int main() { cin >> t; for(int i = 0; i < t; ++i) { solve(); } return 0; }
标签:typedef,638,ll,CodeForces,long,int,ans,include,div2 来源: https://www.cnblogs.com/pophirasawa/p/12871364.html