对偶数的物品直接加.
奇数的物品每两种再加一个
最后讨论人数为奇数情况.
#include <bits/stdc++.h>
using namespace std;
int b[1005];
int main()
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++){
int a;
cin>>a;
b[a]++;
}
int num=0;
int m=0;
for(int i=1;i<=k;i++){
if(b[i]%2==0){
num+=b[i];
}
else{
num+=((b[i])/2*2);
m++;
if(m%2==0){
num++;
}
}
}
if(n%2!=0&&m%2!=0){
num++;
}
cout<<num<<endl;
}
解方程
两种状态
设x次增加
则n-x次减少
解方程
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
int main()
{
cin>>n>>k;
ll a=1;
ll b=3;
ll c=-(2*k+2*n);
ll o=b*b-4*a*c;
o =sqrt(o);
ll ans=(-b+o)/2;
ans=n-ans;
cout<<ans<<endl;
}
递推
三种选择:选上|选下|不选
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+5;
ll n;
ll h[maxn][2];
ll dp[maxn][3];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>h[i][0];
}
for(int i=1;i<=n;i++){
cin>>h[i][1];
}
for(int i=1;i<=n;i++){
dp[i][0]=max(dp[i-1][2]+h[i][0],dp[i-1][1]+h[i][0]);
dp[i][1]=max(dp[i-1][2]+h[i][1],dp[i-1][0]+h[i][1]);
dp[i][2]=max(dp[i-1][2],max(dp[i-1][0],dp[i-1][1]));
//cout<<dp[i][0]<<' '<<dp[i][1]<<' '<<dp[i][2]<<endl;
}
cout<<max(dp[n][2],max(dp[n][0],dp[n][1]))<<endl;
}
D2 - Submarine in the Rybinsk Sea (hard edition)
对于每个a,与其他数配对时结果只取决于位数和先后.
如 12 和 4位数 一定为 OO1O2O 或 OOO1O2
ai的贡献为
make和make1 为ai在前或在后的两种情况
len[j] :j位数的个数。
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int maxn = 1e5+5;
ll n;
ll a[maxn];
ll mod = 998244353;
ll len[11];
ll make(ll x,int lb)
{
char s[100]{};
itoa(x,s+1,10);
int la=strlen(s+1);
ll ans=0;
if(la>=lb){
int nowa=1,nowb=1;
for( ; nowa<=la-lb+1;nowa++)
{
ans*=10;
ans+=(s[nowa]-'0');
}
while(nowb<=lb||nowa<=la)
{
if(nowb<=lb){
ans*=10;
ans+=0;
nowb++;
}
if(nowa<=la){
ans*=10;
ans+=(s[nowa]-'0');
nowa++;
}
}
}
else{
int nowa=1,nowb=1;
for( ; nowb<=lb-la;nowb++)
{
ans*=10;
ans+=0;
}
while(nowb<=lb||nowa<=la)
{
if(nowa<=la){
ans*=10;
ans+=(s[nowa]-'0');
nowa++;
}
if(nowb<=lb){
ans*=10;
ans+=0;
nowb++;
}
}
}
ans%=mod;
return ans;
}
ll make1(ll x,int la)
{
char s[100]{};
itoa(x,s+1,10);
int lb=strlen(s+1);
ll ans=0;
if(la>=lb){
int nowa=1,nowb=1;
for( ; nowa<=la-lb+1;nowa++)
{
ans*=10;
ans+=0;
}
while(nowb<=lb||nowa<=la)
{
if(nowb<=lb){
ans*=10;
ans+=(s[nowb]-'0');
nowb++;
}
if(nowa<=la){
ans*=10;
ans+=0;
nowa++;
}
}
}
else{
int nowa=1,nowb=1;
for( ; nowb<=lb-la;nowb++)
{
ans*=10;
ans+=(s[nowb]-'0');
}
while(nowb<=lb||nowa<=la)
{
if(nowa<=la){
ans*=10;
ans+=0;
nowa++;
}
if(nowb<=lb){
ans*=10;
ans+=(s[nowb]-'0');
nowb++;
}
}
}
ans%=mod;
return ans;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
for(int i=1; i<=n; i++)
{
char s[100];
itoa(a[i],s,10);
int l=strlen(s);
len[l]++;
}
ll sum=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=11;j++){
sum+=(make(a[i],j)*len[j]);
sum%=mod;
sum+=(make1(a[i],j)*len[j]);
sum%=mod;
}
}
cout<<sum<<endl;
}
没做出来,留坑……