A题 Wasserstein Distance
贪心:同时操作两堆土,从左一直往右扔。
#include<iostream>
#include<cmath>
using namespace std;
int a[100005],b[100005];
int main()
{
int n,t;
cin>>t;
while(t--)
{
cin>>n;
long long ans=0,res=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
cin>>b[i];
for(int i=0;i<n;i++)
{
res+=a[i]-b[i];
ans+=abs(res);
}
cout<<ans<<endl;
}
return 0;
}
B题 合约数
待补…
C题 序列变换
待补…
D题 数字游戏
待补…
E题 小Y吃苹果
水题。。
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
cout<<(1<<n)<<endl;
return 0;
}
F题 1 + 2 = 3?
规律题
#include<iostream>
using namespace std;
typedef long long ll;
ll f[100];
int main()
{
f[0]=f[1]=f[2]=1;
for(int i=3;i<64;i++)
f[i]=f[i-1]+f[i-2];
int t;
cin>>t;
while(t--)
{
ll n,res=0,d;
cin>>n;
while(n)
{
int i=0;
while(n>=f[i])
{
n-=f[i];
i++;
}
d=1;
res+=(d<<(i-1));
}
cout<<res<<endl;
}
return 0;
}
I题 二数
模拟题
#include<iostream>
#include<cstdio>
using namespace std;
char s[100005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s+1);
int flag=0;
for(int i=1;s[i];i++)
{
if(s[i]=='9')
{
for(int j=i;s[j];j++)
printf("8");
break;
}
else if((s[i]-'0')%2==1)
{
for(int j=i+1;s[j];j++)
{
if(s[j]>'4')
{
flag=1;
break;
}
else if(s[j]<'4')
break;
}
if(flag)
{
printf("%c",s[i]+1);
for(int j=i+1;s[j];j++)
printf("0");
break;
}
else
{
char c=s[i]-1;
if(i==1)
{
if(s[i]!='1'||s[i+1]=='\0')
printf("%c",c);
}
else
printf("%c",c);
for(int j=i+1;s[j];j++)
printf("8");
break;
}
}
else
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}
J题 小Y写文章
待补…
L题 K序列
设dp[i][j]表示前i个数中余数为j的最长子序列,则状态转移方程为
如果 dp[i-1][j]==0 dp[i][(j+a[i])%k] = dp[i-1][(j+a[i])%k]
否则 dp[i][(j+a[i])%k] = max(dp[i-1][j]+1,dp[i-1][(j+a[i])%k])
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e7+10;
int a[N],dp[2][N];
int main()
{
int n,k;
while(cin>>n>>k)
{
for(int i=0;i<n;i++)
{
cin>>a[i];
a[i]%=k;
}
memset(dp,0,sizeof(dp));
dp[0][a[0]]=1;
int flag=1;
for(int i=1;i<n;i++,flag^=1)
{
for(int j=0;j<k;j++)
{
int p=(j+a[i])%k;
dp[flag][p]=(dp[flag^1][j]&&(dp[flag^1][p]<dp[flag^1][j]+1))?dp[flag^1][j]+1:dp[flag^1][p];
}
}
cout<<max(dp[0][0],dp[1][0])<<endl;
}
return 0;
}