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;
}