【noip】跟著洛谷刷noip題2
阿新 • • 發佈:2017-10-12
lap log 跟著 als blog mes 長度 else void
noip好難呀。
上一個感覺有點長了,重開一個。
36.Vigenère 密碼
粘個Openjudge上的代碼
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include <cstdlib> #include <algorithm> #include <iomanip> using namespace std; char a[101],s[1001],b[1001]; int c[1001],j; int main() { int la,ls,i,j; gets(a); gets(s); la=strlen(a); ls=strlen(s); for(i=0;i<la;i++) {if(a[i]<=90) a[i]=a[i]+32;} for(i=0;i<la;i++) c[i]=a[i]-97; for(i=0;i<ls;i++) c[i+la]=c[i]; for(i=0;i<ls;i++) { b[i]=s[i]-c[i]; if((s[i]>=65&&b[i]<65)||(s[i]>=97&&b[i]<97)) b[i]=b[i]+26; } puts(b); return 0; }
37.國王遊戲
貪心。手動艾特LLJ。
粘一個別人的代碼。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; int n,i,sum[10000],kx,ky,t[10000],ans[10000]; struct node { int x; int y; }a[1001];//每個大臣的左右手數值 bool cmp(node a,node b) { return a.x*a.y<b.x*b.y;//按照左右手乘積排序 } bool judge()//用來判斷當前大臣的結果是不是比ans大 { int i; for (i=1;i<=t[0];++i) if (t[i]>ans[i]) return true; else if (t[i]<ans[i]) return false; return false; } void mul(int x)//高乘 { int g=0,i; for (i=1;i<=sum[0];++i) { sum[i]=sum[i]*x+g; g=sum[i]/10; sum[i]=sum[i]%10; } while (g!=0) { ++sum[0]; sum[sum[0]]=g%10; g/=10; } } void divv(int x)//高除,附帶比較當前大臣答案和ans的大小關系 { int num=0,i=sum[0]+1,s=0; memset(t,0,sizeof(t)); while (num<x) { --i; num=num*10+sum[i]; } t[0]=i; for (;i>=1;--i) { t[++s]=num/x; num=num%x*10+sum[i-1]; } //高除,其中t保存當前大臣的結果 if (t[0]>ans[0]||t[0]==ans[0]&&judge())//.若比ans大則更新ans { ans[0]=t[0]; for (i=1;i<=t[0];++i) ans[i]=t[i]; } } int main() { cin>>n; cin>>kx>>ky; sum[1]=kx; sum[0]=1; ans[0]=1; ans[1]=0; //下標0保存長度 //sum用來計算到第i個大臣的左手乘積 for (i=1;i<=n;++i) cin>>a[i].x>>a[i].y; sort(a+1,a+n+1,cmp); for (i=1;i<=n;++i) { mul(a[i].x); divv(a[i].y*a[i].x);//因a[i].x當前已經乘過所以除的時候要再除一遍 } for (i=1;i<=ans[0];++i) cout<<ans[i]; }
【noip】跟著洛谷刷noip題2