2022.3.23
阿新 • • 發佈:2022-03-24
Codeforces Round #764 (Div. 3)
A. Plus One on the Subset
從最小的變成最大的,也就是最大值和最小值之差。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=1e5+10,INF=1e8; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int n; cin >> n; int mmax = -1, mmin = 1e9; for (int i = 1; i <= n;i++) { int x; cin >> x; mmin = min(mmin, x); mmax = max(mmax, x); } cout << mmax - mmin << '\n'; } return 0; }
B - Make AP
讓他變成等差數列但是注意是不能改變a,b,c的順序的,先判斷abc原本是不是等差數列,如果不是再判斷,如果公差大於b的話並且a+c能夠整除2b的話說明是可以構造的(等差數列性質,a1+a3=2a2),否則不行,如果公差小於等於b的話,那麼久看看a和c能不能再構成一個等差數列,正的反的都可以。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=1e5+10,INF=1e8; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { int a, b, c; cin>>a >> b >> c; if(a+c==2*b) cout << "YES" << '\n'; else { if(2*b<a+c) { if((a+c)%(2*b)==0) cout << "YES" << '\n'; else cout << "NO" << '\n'; } else { if((2*b-c)%a==0) { cout << "YES" << '\n'; } else if((2*b-a)%c==0) { cout << "YES" << '\n'; } else cout << "NO" << '\n'; } } } return 0; }
C. Division by Two and Permutation
最終是要構成全排列,我們把當前大於n的數不斷除2直到小於n,並且記錄當前可以用於構成全排列的數的數量。如果當某個位置的數有多個的話只保留一個,並讓多出來的/2,構成其他的,如果到最後每個位置都有的話說明成功。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=50+10,INF=1e8; int a[N],cnt[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); int t; cin>>t; while(t--) { memset(cnt, 0, sizeof cnt); int n; cin >> n; for (int i = 1; i <= n;i++) { cin >> a[i]; } for (int i = 1; i <= n;i++) { while(a[i]>n) { a[i] /= 2; } cnt[a[i]]++; } int f = 0; for (int i = n; i >= 1;i--) { if(cnt[i]==0) { f = 1; break; } while(cnt[i]>1) { cnt[i]--; cnt[i / 2]++; } } if(f) cout << "NO" << '\n'; else cout << "YES" << '\n'; } return 0; }
D - Palindromes Coloring
我們先統計一下每個字母的個數,看看有多少對字母,通過這些字母可以構成迴文串,但是漏看了剩下的落單的字母個數,因為我們要使當前的長度最小的迴文串的長度儘可能的大,如果剩下來的字母的數量足夠讓每個字串的長度都+1的話就可以實現了
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=2e5+10,INF=1e8;
int a[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while(t--)
{
memset(a, 0, sizeof a);
string s;
int n, k;
cin >> n >> k;
cin >> s;
for (int i = 0; i < s.size();i++)
{
a[s[i]-'a']++;
}
int cnt1=0,cnt2=0;
for (int i = 0; i < 26;i++)
{
cnt1 += a[i] / 2;
if(a[i]&1)
cnt2++;
}
int ans = cnt1 / k;
if((cnt1-ans*k)*2+cnt2>=k)
cout << ans * 2 + 1 << '\n';
else cout << ans * 2 << '\n';
}
return 0;
}