# | 题目 |
---|---|
A | 【NOIP2012 提高组 day1】Vigenère密码 |
B | 【NOIP2012 提高组 day1】国王游戏 |
C | 【NOIP2012 提高组 day1】开车旅行 |
写题解之前先喊一声 awsl
A. 【NOIP2012 提高组 day1】Vigenère密码
友好的送分题,,,,
很容易发现明文 t 和密文 mm ,密匙 kk 之间的关系:
t=(mm-kk+26)%26+65;
然后用toupper toulower转大小写就行了
B. 【NOIP2012 提高组 day1】国王游戏
这题,,,咋这么熟悉,,
不就是小蓝书上的例题么,,,
因为之前看过,所以这次我打算自己把贪心策略证明出来
然后,,翻车,,,
后来检查自己的草稿原来我算当前大臣的金币数时把他自己的左手数字也乘上去了,,,
不过这题真正毒瘤的居然是高精度!!!
改这压位高精真的耗了我一下午,,,(菜到安详)
#include<bits/stdc++.h>
#define mod 10000
using namespace std;
int n,l[1005],r[1005],ans[10010],sum[10010],c[10010],top,to1,to2;
long long a,b;
struct node{
long long l,r;
long long data;
}pr[1005];
bool cmpy(node x,node y){
return x.data<y.data;
}
void chu(long long x){
memset(c,0,sizeof(c));
int t=0,flag=0;
to2=0;
for(int i=top;i>=1;i--){
t=t*mod+sum[i];
c[++to2]=t/x;
if(!c[to2]&&!flag)to2--;
else flag=1;
t%=x;
}
}
bool cmp(){
if(to2>to1)return 1;
if(to2<to1)return 0;
for(int i=1;i<=to1;i++){
if(c[i]>ans[i])return 1;
if(c[i]<ans[i])return 0;
}
return 0;
}
void cheng(long long x){
for (int i=1;i<=top;i++)
sum[i]*=x;
for (int i=1;i<=top;i++){
sum[i+1]+=sum[i]/10000;
sum[i]%=10000;
}
if (sum[top+1]!=0)top++;
}
int main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
scanf("%d%lld%lld",&n,&a,&b);
for(int i=1;i<=n;i++){
scanf("%lld%lld",&pr[i].l,&pr[i].r);
pr[i].data=pr[i].l*pr[i].r;
}
sort(pr+1,pr+n+1,cmpy);
sum[1]=a;top=1;
for(int i=1;i<=n;i++){
chu(pr[i].r);
if(cmp()){
to1=to2;
memcpy(ans,c,sizeof(c));
}
cheng(pr[i].l);
}
printf("%d",ans[1]);
for(int i=2;i<=to1;i++){
printf("%04d",ans[i]);
}
return 0;
}
C. 【NOIP2012 提高组 day1】开车旅行
又是个老朋友,,,
这道题之前就让我快自闭了,,虽然知道正解是倍增优化但连刚开始的预处理都写不出来,,
最终打了爆搜,出了点小失误结果本来就不多的分又被扣了十分,,,,
因为还在改,所以代码莫得(以后可能也不会有了)