day1
维吉尼亚解密:
从图中可以看出,就是将明文的字母,向前移动对应密钥字母在26字母中的排名数个格子就是原文。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
char key[110];
char dark[1100];
int main(){
freopen("vigenere.in","r",stdin);
freopen("vigenere.out","w",stdout);
scanf("%s%s",&key,&dark);
int j=0;
int l=strlen(key);
for (int i=0;i<strlen(dark);i++){
int ch=tolower(key[j])-'a';
char cmd=dark[i]>'Z'?'a':'A';
int x=(dark[i]-cmd-ch+26)%26;
printf("%c",cmd+x);
j=(j+1)%l;
}
return 0;
}
国王游戏:
其实就是按照大臣左右手乘积的大小排序加上一个高精度。
证明要点:从最后一个人开始推,假设其与前面的一人交换,则导致结果变大。
参考程序:
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 11000
using namespace std;
struct King{
int l,r;
bool operator < (const King &b)const{
return l*r<b.l*b.r;
}
}a[maxn];
int t[maxn];
int ans[maxn];
int f[maxn];
int len=0,alen=0,n;
void Div(int x){
int y=0;
memset(t,0,sizeof(t));
for (int i=len-1;i>=0;i--){
y=y*10+f[i];
t[i]=y/x;
y%=x;
}
int j=len;
while (!t[j-1])j--;
if (alen<j){
alen=j;
for (int i=0;i<j;i++)
ans[i]=t[i];
}else if (alen==j){
bool flag=true;
for (int i=0;i<j;i++)
if (ans[i]<t[i]){flag=false;break;}
if (!flag)for (int i=0;i<j;i++)ans[i]=t[i];
}
}
void mult(int x){
for (int i=0;i<len;i++)
f[i]*=x;
for (int i=0;i<len;i++){
f[i+1]+=f[i]/10;
f[i]%=10;
}
while (f[len]>0){
f[len+1]=f[len]/10;
f[len]=f[len]%10;
len++;
}
}
int main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdou