样例过了,为啥20分?

P3955 [NOIP2017 普及组] 图书管理员

Lazy_make_name @ 2024-03-06 22:09:46

这段代码我改了N次了 我的做法有点暴力,因为我知道不会超时

#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main(){
    int n,q;
    cin>>n>>q;
    string zx;
    string yuan[n+1];
    int wei[q+1];
    string xu[q+1];
    for(int i=1;i<=n;i++)
        cin>>yuan[i];
    for(int i=1;i<=q;i++){
        cin>>wei[i];
        cin>>xu[i];
    }
    zx="100000001";
    for(int i=1;i<=q;i++){//需求码
        zx="100000001";
        for(int j=i;j<=n;j++)//图书编码 
            if(yuan[j].find(xu[i],xu[i].size()-wei[i])!=-1)
                if(zx.size()!=yuan[j].size())
                    if(zx.size()>yuan[j].size())
                        zx=yuan[j]; 
                    else
                        if(zx>yuan[j])
                            zx=yuan[j];
        if(zx=="100000001")
            cout<<-1<<endl;
        else
            cout<<zx<<endl;
    }
}

by SMall_X_ @ 2024-03-06 22:17:33

要标记


by sll00 @ 2024-03-06 23:32:35

@shimingxin1007 不用标记


by sll00 @ 2024-03-06 23:34:29

@13860121259AaBb 可以参考一下我的做法我用字符串查找来处理

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define pii pair<int,int>
#define mp make_pair
#define st string
#define vint vector<int>
#define vll vector<ll>
#define For(i,l,r) for(int i=(int)(l);i<=(int)(r);i++)
#define Refor(i,r,l) for(int i=(int)(r);i>=(int)(l);i--)
#define pb push_back
#define maxn 1005
struct test
{
    int s;
    st num;
}brr[maxn];
st arr[maxn];
ll krr[maxn];
bool cmp1(test o,test p)
{
    if(o.num.size()==p.num.size())
    {
        return o.num<p.num;
    }
    else
    {
        return o.num.size()<p.num.size();
    }
}
bool cmp(st o,st p)
{
     if(o.size()==p.size())
    {
        return o<p;
    }
    else
    {
        return o.size()<p.size();
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n,q;
    cin>>n>>q;
    For(i,1,n)
    {
        cin>>arr[i];
        krr[i]=0;
    }
    bool flag=false;
    For(i,1,q)
    {
        cin>>brr[i].s>>brr[i].num;
    }
    sort(arr+1,arr+1+n,cmp);
    For(i,1,q)
    {
        flag=false;
        For(j,1,n)
        {
            if(arr[j].rfind(brr[i].num)!=arr[j].npos&&arr[j].size()>=brr[i].num.size()&&arr[j].rfind(brr[i].num)==arr[j].size()-brr[i].s)
            {
                cout<<arr[j]<<endl;
                flag=true;
                break;
            }
        }
        if(flag==false)
        {
            cout<<-1<<endl;
        }
    }
    return 0;
}

by Lazy_make_name @ 2024-03-07 13:21:36

@sll00 我是萌新,这样的做法我看不懂,麻烦加些注释


by sll00 @ 2024-03-07 21:16:33

@13860121259AaBb 我的大致思路就是,输入完后依据编号大小来排序,(长度相同直接比较,不相同长的为大的编号)。排好序(主要是按字典序输出),然后一个暴力遍历一遍就好了。

最主要还是要注意那个读者编号是那个书的后几位编号!希望有帮助


by suberking_99 @ 2024-06-17 22:13:32

逻辑有问题


|