CF1348B Phoenix and Beauty
想法:
我们可以直接考虑序列 a 中不同元素的个数,如果不同元素的个数 > k ,那么肯定是无解的,直接输出 -1
不然的话,我们考虑直接将这不同的数 ( <= k 个 ) 复制 n 次,如果个数不满 k 的话,我们考虑都添加相同的数上去就好了。
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define ll long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f3f3f3f3f #define max(a, b) (a>b?a:b) #define min(a, b) (a<b?a:b) #define LL ll const double eps = 1e-10; const int maxn = 2e4 + 10; const LL MOD = 99999999999999; int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; } using namespace std; ll a[maxn],b[2*maxn]; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int n,k; cin >> n >> k; set<ll> st; for (int i = 1;i <= n;i++) { cin >> a[i]; st.insert(a[i]); } if (st.size() > k) cout << -1 << endl; else { cout << n * k << endl; for (int i = 1;i <= n;i++) { for (auto x:st) cout << x << " "; for (int j = 1;j <= k-st.size();j++) cout << 1 << " "; } cout << endl; } } return 0; }
CF1348C Phoenix and Distribution
想法:
我们很容易想到对字符串进行排序之后,前 k 个字符分别对应 分成的 k 个部分的首字符,然后我们分类讨论
如果 s[1] != s[k] , 那么我们直接输出 s[k] 就好了,因为它一定是最大的。
如果 s[1] == s[k] && s[k+1] != s[n] , 那么我们直接将 k ~ n 直接输出就好了
如果 s[1] == s[k] && s[k+1] == s[n] ,那么我们考虑均匀分配,就像 样例一 一样
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define ll long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f3f3f3f3f #define max(a, b) (a>b?a:b) #define min(a, b) (a<b?a:b) #define LL ll const double eps = 1e-10; const int maxn = 2e5 + 10; const LL MOD = 99999999999999; int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; } using namespace std; char s[maxn]; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { int n,k; cin >> n >> k; cin >> (s+1); sort(s+1,s+1+n); if (s[1] != s[k]) cout << s[k] << endl; else if (s[k+1] != s[n]) { for (int i = k;i <= n;i++) cout << s[i]; cout << endl; } else { cout << s[1]; for (int i = 1;i <= (n-1)/k;i++) cout << s[k+1]; cout << endl; } } return 0; }
CF1348D Phoenix and Science
想法:
我们不难发现每次增长的质量其实是和此时细菌的个数有关的。
我们假设第i天有 x 个细菌,当天晚上的话 我们的质量最多可以为 2x
我们考虑贪心的每次选取最多的,然后后面肯定是剩下一个不是最大的,那样我们直接取出来就好了。
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define ll long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f3f3f3f3f #define max(a, b) (a>b?a:b) #define min(a, b) (a<b?a:b) #define LL ll const double eps = 1e-10; const int maxn = 2e4 + 10; const LL MOD = 99999999999999; int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; } using namespace std; int main() { ios::sync_with_stdio(false); int t; cin >> t; while (t--) { vector<ll> v; ll n; cin >> n; ll x = 1; while (n > 0) { if (n < x) v.push_back(n); else v.push_back(x); n -= x; x <<= 1; } cout << v.size() - 1 << endl; sort(v.begin(),v.end()); for (int i = 1;i < v.size();i++) cout << v[i] - v[i-1] << ' '; cout << endl; } return 0; }
CF1348E Phoenix and Berries
想法:
#pragma GCC optimize(2) #pragma GCC optimize(3) #include <algorithm> #include <string> #include <cstring> #include <vector> #include <map> #include <stack> #include <set> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <ctime> #include <bitset> #include <cmath> #include <sstream> #include <iostream> #define ll long long #define ls nod<<1 #define rs (nod<<1)+1 #define pii pair<int,int> #define mp make_pair #define pb push_back #define INF 0x3f3f3f3f3f3f3f3f #define max(a, b) (a>b?a:b) #define min(a, b) (a<b?a:b) const double eps = 1e-10; const int maxn = 5e2 + 10; const ll MOD = 99999999999999; int sgn(double a) { return a < -eps ? -1 : a < eps ? 0 : 1; } using namespace std; template<typename elemType> inline void Read(elemType &T){ elemType X=0,w=0; char ch=0; while(!isdigit(ch)) {w|=ch=='-';ch=getchar();} while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); T=(w?-X:X); } ll dp[maxn][maxn]; int a[maxn],b[maxn];; int main() { ios::sync_with_stdio(false); int n,k; Read(n); Read(k); for (register int i = 1;i <= n;i++) { Read(a[i]); Read(b[i]); } memset(dp,-1,sizeof(dp)); dp[0][0] = 0; ll sum = 0; for (register int i = 1;i <= n;++i) { for (register int j = 0;j < k;++j) { if (dp[i-1][j] == -1) continue; dp[i][(j+a[i])%k] = dp[i-1][j] + (j+a[i])/k +(sum-j-dp[i-1][j]*k+b[i])/k; // 不考虑混合的情况 for (register int z = 0;z < k;++z) { if (a[i] >= z && b[i] >= k-z) dp[i][(j+a[i]-z)%k] = max(dp[i][(j+a[i]-z)%k],dp[i-1][j] + 1 + (j+a[i]-z)/k + (sum-j-k*dp[i-1][j]-(k-z)+b[i])/k); } } sum += (a[i] + b[i]); } ll ans = 0; for (register int i = 0;i < k;i++) ans = max(ans,dp[n][i]); printf("%lld\n",ans); return 0; }