$NOIP2012$ 题解报告

时间:2019-11-05
本文章向大家介绍$NOIP2012$ 题解报告,主要包括$NOIP2012$ 题解报告使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

目录

$Luogu\ P1079$ $Vigenère$密码$(\ √\ )$

$Luogu\ P1080$ 国王游戏$(\ √\ )$

$Luogu\ P1081$ 开车旅行( )

$Luogu\ P1082$ 同余方程$(\ √\ )$

$Luogu\ P1083$ 借教室( )

$Luogu\ P1084$ 疫情控制( )


$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$ 疫情控制

题目传送门

原文地址:https://www.cnblogs.com/THWZF/p/11799739.html