Codeforces Round #574 (Div. 2) A B C D1
Codeforces Round #574 (Div. 2)
#include<bits/stdc++.h> using namespace std; const int N = 1e3+100; typedef long long ll; int n,k; int a[N]; int b; int cnt=0; int main(){ cin >> n >> k; for(int i=0;i<n;i++){ cin >> b; a[b]++; } int cnt=(n+1)/2; int sum=0; for(int i=1;i<=k;i++){ if(cnt>=a[i]/2) cnt-=a[i]/2,sum+=a[i]/2*2,a[i]%=2; else { while(a[i]>=2&&cnt>0){ a[i]-=2; cnt--; sum+=2; } } if(cnt==0) break; } for(int i=1;i<=k;i++){ if(cnt==0) break; if(a[i]>0){ a[i]--; cnt--; sum++; } } cout << sum << endl; return 0; }
假设 a 为操作1执行次数,b为操作2执行次数
a + b = n
1 + ( a - 1 ) * a / 2 - b = k
解方程
#include<bits/stdc++.h> using namespace std; const int N = 1e3+100; typedef long long ll; ll n,k; int main(){ cin >> n >> k; ll x=(-3+sqrt((n+k)*8+9))/2; cout << n - x << endl; return 0; }
dp[i][j] 表示选第 j 行第 i 个数的最大值
dp[i][j] = max( dp[i-1][j^1] , dp[i-2][j] , dp[i-2][j^1] );
#include<bits/stdc++.h> using namespace std; const int N = 1e5+100; typedef long long ll; int n; ll a[2][N]; ll dp[N][2]; int main(){ cin >> n; for(int i=1;i<=n;i++){ cin >> a[0][i]; } for(int i=1;i<=n;i++){ cin >> a[1][i]; } ll ma=0; for(int i=1;i<=n;i++){ for(int j=0;j<2;j++){ dp[i][j]=max(dp[i][j],dp[i-1][(j+1)%2]+a[j][i]); dp[i][j]=max(dp[i][j],dp[i-2][j]+a[j][i]); dp[i][j]=max(dp[i][j],dp[i-2][(j+1)%2]+a[j][i]); ma=max(dp[i][j],ma); } } cout << ma << endl; return 0; }
D1Submarine in the Rybinsk Sea (easy edition)
每个数在 i 位都加了 n 次
#include<bits/stdc++.h> using namespace std; const int N = 1e5+100; typedef long long ll; #define mod 998244353 int n; ll a[N]; ll qpow(ll x,int y){ ll res=1; while(y){ if(y&1) res=res*x%mod; x=x*x%mod; y/=2; } return res; } int main(){ cin >> n; ll sum = 0; ll res=0; for(int i=0;i<n;i++){ cin >> a[i]; int cnt=0; sum = a[i]; while(sum){ res=(res + sum%10*n%mod*qpow(10,cnt)%mod)%mod; cnt++; res=(res + sum%10*n%mod*qpow(10,cnt)%mod)%mod; cnt++; sum/=10ll; } } cout << res << endl; return 0; }