• noi online(入门组) round3


    果然这次的题目都太友好了....

    我算了一下,如果我没有提交错代码

    但是没什么好说的,,自己太粗心了...第二题答案换行了,第三题我在用不同的方法做,然后把错误的做法交上去了


    P6565 [NOI Online #3 入门组]最急救助

    这个题就很模板模板的用KMP就可以做出来啦,比较简单

    比标准的KMP可能还要简单些,因为这个题目要匹配的字符串就直接给了,对于匹配字符串不需要预处理,所以显得还要更加简单一点

    #include <bits/stdc++.h>
    using namespace std;
    const int N=305,inf=0x3f3f3f;
    char name[N][25],words[N][N];
    char a[10];
    int ans[N],p[N],m=3,maxx,n;
    void kmp(int k)
    {
        int len=strlen(words[k]+1);
        int j=0;
        for(int i=0;i<len;i++)
        {
            while(j>0&&words[k][i+1]!=a[j+1]) j=p[j];
            if(words[k][i+1]==a[j+1]) j++;
            if(j==3){
                 ans[k]++;j=p[j];
                 if(ans[k]>=maxx){  maxx=ans[k];}
            }
        }     
    }
    int main()
    {
         //freopen("save.in","r",stdin);
        //freopen("save.out","w",stdout);
        scanf("%d",&n);
        a[1]='s';a[2]='o';a[3]='s';
        p[1]=0;p[2]=0;p[3]=1;//预处理可以直接处理
        for(int i=1;i<=n;i++){
            scanf("%s",name[i]+1);
            scanf("%s",words[i]+1);
            kmp(i);
        }
        for(int i=1;i<=n;i++)
            if(ans[i]==maxx)
                printf("%s ",name[i]+1);
        printf("
    ");
        printf("%d
    ",maxx);
        return 0;
    }

     这个题目直接比较也能过,数据比较小

    #include<bits/stdc++.h>
    using namespace std;
    string name[105],xh;
    int m,a[105];
    int main(){
        int n;
        cin>>n;
        for(int i=0;i<n;i++)a[i]=0;
        for(int i=0;i<n;i++){
            int count=0;
            cin>>name[i]>>xh;
            int l=xh.length();
            for(int j=0;j+2<l;j++){
                if(xh[j]=='s'&&xh[j+1]=='o'&&xh[j+2]=='s')count++;
            }
            if(count>=m){
                m=count;
                a[i]=m;    
            }
        }
        for(int i=0;i<n;i++){
            if(a[i]==m)cout<<name[i]<<' ';
        }
        cout<<endl<<m;
        return 0;
    }

    P6566 [NOI Online #3 入门组]观星(民间数据)

     这个题目我觉得数据出得比较好,好吧我自己的代码有点小问题,所以只能得80分,我把计算最大值写在了if语句中,应该写在外面,所以会少一种情况。。。

    但是我交上去的代码换行了!!!!!太久没考试了,导致我粗心的毛病越来越重了

     这个题目数据好像dfs和bfs都可以,都差不多其实

    #include <bits/stdc++.h>
    using namespace std;
    const int N=1e6+5,inf=0x3f3f3f;
    struct node{
        int x,y;
    };
    int pd[N],res,maxx;
    int n,m,a[1505][1505];
    int d[8][2]={{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};
    void bfs(int x,int y)
    {
        queue<node>q;int ans=1;
        q.push((node){x,y});
        a[x][y]=0;
        while(!q.empty()){
            node p=q.front();q.pop();
            for(int i=0;i<8;i++){
                int rx=p.x+d[i][0],ry=p.y+d[i][1];
                if(rx>=1&&rx<=n&&ry>=1&&ry<=m&&a[rx][ry]){
                    ans++;a[rx][ry]=0;
                    q.push((node){rx,ry});
                }
            }
        }
        //cout<<ans<<endl;
        if(!pd[ans]){
            res++;
            pd[ans]=1;
        }
        else{
            pd[ans]++;
        } 
        maxx=max(maxx,ans*pd[ans]);//就是这里我没有写在外面 
    }
    int main()
    {
         //freopen("star.in","r",stdin);
        //freopen("star.out","w",stdout);
        char c;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                cin>>c;
                if(c=='*') a[i][j]=1;
                else a[i][j]=0;
            }
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                if(a[i][j])
                    bfs(i,j);
            }
        printf("%d %d
    ",res,maxx);
        return 0;
    }

    P6567 [NOI Online #3 入门组]买表(民间数据)

    这个题目应该也有很多做法,可以是用多重背包的二进制转换成01背包来做,是一个动态规划的题目,也可以用有限硬币的方法来做,但可能就得不到满分吧

    #include <bits/stdc++.h>
    using namespace std;
    const int N=500005,inf=0x3f3f3f3f;
    int num,n,m,p; 
    int f[N],a[N];
    long long sum;
    int main()
    {
         //freopen("watch.in","r",stdin);
        //freopen("watch.out","w",stdout);
        scanf("%d%d",&n,&m);
        int x,y;
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            sum+=x*y;
            int t=1;
            while(y>=t){
                a[++num]=x*t;
                y-=t;
                t*=2;
            }
            a[++num]=x*y;
        }
        if(sum>N) sum=500000;
        f[0]=1;
        for(int i=1;i<=num;i++){
            for(int j=sum;j>=a[i];j--)
                f[j]|=f[j-a[i]];
        }
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&p);
            if(f[p]>0)
                printf("Yes
    ");
            else
                printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    python 循环的概念
    python 字典的基本操作
    短路表达式
    快捷键myeclipse
    nginx静态文件访问
    安装mysql
    安装mongodb
    安装tomcat
    安装jdk8
    安装node和pm2
  • 原文地址:https://www.cnblogs.com/sunny99/p/12964758.html
Copyright © 2020-2023  润新知