1.Vigenère密码
一开始以为是明码反暗码,就直接把密码表预处理,然后测了多好多遍还是没过样例,十分困惑与不解然后就看一了一遍题目(咳,
暗码减去密码取模
这一遍很自信然后爆零了
(输出区分大小写
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1010;
char m[maxn],k[maxn];
int lm,lk,key[maxn];
int main()
{
freopen("vigenere.in","r",stdin);
freopen("vigenere.out","w",stdout);
scanf("%s%s",k,m);
lm=strlen(m),lk=strlen(k);
for(int i=0;i<lk;i++)
if(k[i]>='a'&&k[i]<='z') key[i]=k[i]-'a';
else key[i]=k[i]-'A';
int j=0;
for(int i=0;i<lm;i++)
{
char tmp;
if(m[i]>='a'&&m[i]<='z') tmp='a',m[i]-='a';
else tmp='A',m[i]-='A';
m[i]-=key[j];
if(m[i]<0) m[i]+=26;
m[i]+=tmp;
j++;
if(j>=lk) j-=lk;
}
for(int i=0;i<lm;i++)
printf("%c",m[i]);
return 0;
}
2.国王游戏
手推几组数据就很容易得到一个结论:最优的方案肯定是大臣们按成绩升序排序时候的序列,然后要打高精度(想吐。初测六十,位数最高点没处理好
结论摸鱼证明:
A1…Ax-1AxAx+1…Ay-1AyAy+1
设A1到Ax-1乘积为k1,那么Ax的钱就是k1/Bx,
设Ax+1到Ay-1乘积为k2,那么Ay的钱就是k1*Ax*k2/By
那么最优方案就是max(k1/Bx,k1*Ax*k2/By)
讲Ay和Ax互换,同理可得此时最优方案是max(k1/By,k1*k2*Ay/Bx)
易得