$NOIP2008$ 题解报告

目录

•$Luogu P1006$ 传纸条$( √ )$

•$Luogu P1125$ 笨小猴$( √ )$

•$Luogu P1149$ 火柴棒等式$( √ )$

$Luogu P1155$ 双栈排序$( √ )$


$Luogu P1006$ 传纸条

题目传送门

相当于从左上角找两条不相交的路径到右下角,设$f[x][i][j]$为走了$x$步,左边的路径在第$i$行,右边的路径在第$j$行时的最大答案。

同一时刻两条路径到达的点一定在一条从左下指向右上的对角线上,所以我们可以直接根据行求出列,注意一下实现时的细节

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=52;
 4 int f[N*2][N][N];
 5 int n,m,a[N][N];
 6 int Max(int a,int b,int c,int d){
 7     int maxn=a;
 8     if(b>maxn) maxn=b;
 9     if(c>maxn) maxn=c;
10     if(d>maxn) maxn=d;
11     return maxn;
12 }
13 int main(){
14     scanf("%d%d",&m,&n);
15     for(int i=1;i<=m;i++)
16       for(int j=1;j<=n;j++)
17         scanf("%d",&a[i][j]);
18     f[0][1][1]=0;
19     for(int k=1;k<m+n;k++)
20       for(int i=1;i<m;i++)
21         for(int j=i+1;j<=m;j++){
22             if(k-i+1<1||k-j+1<1) continue;
23             f[k][i][j]=Max(f[k-1][i][j],f[k-1][i-1][j-1],f[k-1][i][j-1],f[k-1][i-1][j])+a[i][k-i+1]+a[j][k-j+1];
24             //if(i==j) f[k][i][j]-=a[i][k-i+1];
25         }
26     printf("%d",f[n+m-1][m-1][m]);
27     return 0;
28 }
代码戳这里

$Luogu P1125$ 笨小猴

题目传送门

计算每个字符出现的次数,然后求出最大值和最小值,判断两者之差是否为质数用试除法即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int num[30],maxn=0,minn=100;
 4 char ch;
 5 bool zhishu(int x){
 6     if(x<=1) return 0;
 7     for(int i=2;i*i<=x;i++)
 8       if(x%i==0) return 0;
 9     return 1;
10 }
11 int main(){
12     ch=getchar();
13     while(ch!='
'){
14         num[ch-96]++;
15         ch=getchar();
16     }
17     for(int i=1;i<=26;i++){
18         if(!num[i]) continue;
19         if(num[i]>maxn) maxn=num[i];
20         if(num[i]<minn) minn=num[i];
21     }
22     int ans=maxn-minn;
23     if(zhishu(ans)) printf("Lucky Word
%d",ans);
24     else printf("No Answer
0");
25     return 0;
26 }
代码戳这里

$Luogu P1149$ 火柴棒等式

题目传送门

枚举火柴可能拼出的数,然后判断需要的火柴数是否恰好是题目给出的火柴数$($记得减去加号和等号所需的火柴$)$

 1 // luogu-judger-enable-o2
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int n,ans=0,num[10]={6,2,5,5,4,5,6,3,7,6};
 5 int sum(int x){
 6     if(x<10)
 7       return num[x];
 8     int e,s=0;
 9     while(x!=0){
10         e=x%10;
11         s+=num[e];
12         x/=10;
13     }
14     return s;
15 }
16 int main(){
17     scanf("%d",&n);
18     n=n-4;
19     for(int i=0;i<=900;++i)
20       for(int j=0;j<=900;++j)
21        {
22              int k=i+j;
23              if(sum(i)+sum(j)+sum(k)==n) ans++;
24        }
25     printf("%d
",ans);
26 }
代码戳这里

$Luogu P1155$ 双栈排序

题目传送门

因为$hl$在$10.27$那天考到了这题,所以我直接贴个$link o$戳这里

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define ri register int
 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 pb push_back
11 using namespace std;
12 il ll fr(){
13     rl w=0,q=1;
14     char ch=G;
15     while(ch<'0'||ch>'9'){if(ch=='-')q=-1;ch=G;}
16     while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+ch-'0',ch=G;
17     return w*q;
18 }
19 const int N=1002;
20 int n,a[N],c[N],mn[N],S1[N],s1,S2[N],s2,pos=1;
21 vector<int> q[N];
22 il bool POP(ri col){
23     if(col==1)if(s1&&S1[s1]==pos){
24         putchar('d');putchar(' ');
25         s1--;pos++;return 1;
26     }
27     if(col==0)if(s2&&S2[s2]==pos){
28         putchar('b');putchar(' ');
29         s2--;pos++;return 1;
30     }
31     return 0;
32 }
33 il void PUSH(ri sum,ri col){
34     if(col==1){
35         while(POP(0));
36         while(s1&&S1[s1]<sum)if(!POP(1))POP(0);
37         while(POP(0));
38         S1[++s1]=sum;putchar('c');putchar(' ');
39     }
40     else{
41         while(s2&&S2[s2]<sum)if(!POP(0))POP(1);
42         S2[++s2]=sum;putchar('a');putchar(' ');
43     }
44 }
45 int main(){
46     //freopen("twostack.in","r",stdin);
47     //freopen("twostack.out","w",stdout);
48     n=fr();
49     go(i,1,n)a[i]=fr();
50     mn[n+1]=n+1;
51     back(i,n,1)mn[i]=min(mn[i+1],a[i]);
52     go(i,1,n)go(j,i+1,n)
53         if(mn[j+1]<a[i]&&a[i]<a[j])
54             q[i].pb(j),q[j].pb(i),c[i]=c[j]=-1;
55     go(i,1,n)
56         if(!(~c[i])){
57             queue<int>Q;Q.push(i);c[i]=0;
58             while(!Q.empty()){
59                 ri p=Q.front();Q.pop();
60                 go(j,0,(int)q[p].size()-1){
61                     if((~c[q[p][j]])&&c[q[p][j]]!=(c[p]^1)){puts("0");return 0;}
62                     if(!(~c[q[p][j]]))Q.push(q[p][j]);
63                     c[q[p][j]]=c[p]^1;
64                 }
65             }
66         }
67     go(i,1,n)PUSH(a[i],c[i]);
68     bool tag=1;
69     while(tag){
70         tag=0;
71         while(POP(0))tag=1;
72         while(POP(1))tag=1;
73     }
74     return 0;
75 }
代码戳这里
原文地址:https://www.cnblogs.com/THWZF/p/11761137.html