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;
}
原文地址:https://www.cnblogs.com/sunny99/p/12964758.html