• $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 }
    代码戳这里
  • 相关阅读:
    模拟测试69
    模拟测试68
    模拟测试66
    NOIP模拟测试15
    NOIP模拟测试14
    Gekoo's checker
    NOIP模拟测试13
    替罪羊树模板
    KDTree笔记
    NOIP模拟测试12
  • 原文地址:https://www.cnblogs.com/THWZF/p/11761137.html
Copyright © 2020-2023  润新知