$Luogu\ P1079$ $Vigenère$密码
很水的模拟题,注意看清题目!
1 #include<bits/stdc++.h> 2 #define ri register int 3 #define ll long long 4 #define rl register ll 5 #define go(i,a,b) for(ri i=a;i<=b;i++) 6 #define back(i,a,b) for(ri i=a;i>=b;i--) 7 #define g() getchar() 8 #define il inline 9 #define pf printf 10 #define mem(a,b) memset(a,b,sizeof(a)) 11 using namespace std; 12 il int fr(){ 13 ri w=0,q=1;char ch=g(); 14 while(ch<'0'||ch>'9'){if(ch=='-')q=-1;ch=g();} 15 while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=g(); 16 return w*q; 17 } 18 char k[102],s1[1002],s2[1002]; 19 int n,m,add='a'-'A'; 20 il char cal(char x,char y){ 21 bool type=0;char ans; 22 //cout<<"x="<<x<<" y="<<y<<endl; 23 int X,Y; 24 if(y>='a'&&y<='z')type=1,Y=y-add-'A'; 25 else Y=y-'A'; 26 if(x>='a'&&x<='z')X=x-add-'A'; 27 else X=x-'A'; 28 //cout<<"X="<<X<<" Y="<<Y<<endl; 29 if(type)ans=(char)(Y-X+26)%26+add+'A'; 30 else ans=(char)(Y-X+26)%26+'A'; 31 //while(ans<0)ans+=26; 32 //cout<<"ans="<<ans<<endl; 33 return ans; 34 } 35 int main(){ 36 freopen("1.in","r",stdin); 37 freopen("1.out","w",stdout); 38 scanf("%s",k);n=strlen(k); 39 scanf("%s",s1);m=strlen(s1); 40 //cout<<"A="<<(int)'A'<<" a="<<(int)'a'<<" add="<<add<<endl; 41 //char c=(char)87;cout<<"c="<<c<<endl; 42 go(i,0,m-1)s2[i]=cal(k[i%n],s1[i]); 43 go(i,0,m-1)pf("%c",s2[i]);puts(""); 44 return 0; 45 }
$Luogu\ P1080$ 国王游戏
贪心经典例题,注意是根据什么排序的
1 #include<bits/stdc++.h> 2 using namespace std; 3 inline int read() 4 { 5 int ret=0,f=1; 6 char ch=getchar(); 7 while(ch>'9'||ch<'0') 8 { 9 if(ch=='-') 10 f=-1; 11 ch=getchar(); 12 } 13 while(ch>='0'&&ch<='9') 14 { 15 ret=(ret<<1)+(ret<<3)+ch-'0'; 16 ch=getchar(); 17 } 18 return ret*f; 19 } 20 int n,lens=1,lenm=1,lena=1,sum[10005]={0,1},maxn[10005]={0,1},ans[10005]; 21 struct node 22 { 23 int a; 24 int b; 25 }s[1005]; 26 inline bool cmp(node x,node y) 27 { 28 return x.a*x.b<y.a*y.b; 29 } 30 inline void mul(int x) 31 { 32 int tmp=0; 33 for(register int i=1;i<=lens;i++) 34 sum[i]*=x; 35 for(register int i=1;i<=lens;i++) 36 { 37 tmp+=sum[i]; 38 sum[i]=tmp%10; 39 tmp/=10; 40 } 41 while(tmp) 42 { 43 lens++; 44 sum[lens]=tmp%10; 45 tmp/=10; 46 } 47 } 48 inline void div(int x) 49 { 50 memset(ans,0,sizeof(ans)); 51 lena=lens; 52 int tmp=0; 53 for(register int i=lena;i;i--) 54 { 55 tmp*=10; 56 tmp+=sum[i]; 57 if(tmp>=x) 58 { 59 ans[i]=tmp/x; 60 tmp%=x; 61 } 62 } 63 while(ans[lena]==0) 64 { 65 if(lena==1) 66 break; 67 lena--; 68 } 69 } 70 inline void cmp1() 71 { 72 if(lena>lenm) 73 { 74 for(register int i=1;i<=lena;i++) 75 maxn[i]=ans[i]; 76 lenm=lena; 77 } 78 else if(lenm==lena) 79 { 80 for(register int i=lena;i;i--) 81 { 82 if(maxn[i]<ans[i]) 83 { 84 for(register int j=1;j<=lena;j++) 85 maxn[j]=ans[j]; 86 lenm=lena; 87 break; 88 } 89 } 90 } 91 } 92 inline void write() 93 { 94 for(register int i=lenm;i;i--) 95 printf("%d",maxn[i]); 96 } 97 int main() 98 { 99 n=read(); 100 s[0].a=read(); 101 s[0].b=read(); 102 for(register int i=1;i<=n;i++) 103 { 104 s[i].a=read(); 105 s[i].b=read(); 106 } 107 sort(s+1,s+n+1,cmp); 108 for(register int i=1;i<=n;i++) 109 { 110 mul(s[i-1].a); 111 div(s[i].b); 112 cmp1(); 113 } 114 write(); 115 return 0; 116 }
$Luogu\ P1081$ 开车旅行
之前写过一篇题解,贴个$link\to$戳这里
代码还没过$QAQ$
$Luogu\ P1082$ 同余方程
扩展欧几里德模板
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 ll a,b,x,y; 5 ll exgcd(ll a,ll b,ll &x,ll &y){ 6 if(!b) {x=1;y=0;return a;} 7 ll d=exgcd(b,a%b,x,y); 8 ll z=x;x=y;y=z-y*(a/b); 9 return d; 10 } 11 int main(){ 12 cin>>a>>b; 13 ll ans=exgcd(a,b,x,y); 14 cout<<(x%b+b)%b<<endl; 15 return 0; 16 }
$Luogu\ P1083$ 借教室
$Luogu\ P1084$ 疫情控制