70pts,求调

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

_200825_ @ 2024-08-20 10:50:48

#include<bits/stdc++.h>
using namespace std;
int book[10000],reader[10000],readernum[10000],readerneed[10000];//书籍编号,读者需求码和其位数,是否找到
int i,j,n,q,num;//n,q同题目
void find(int x,int a,int b,int c){
    num=pow(10,x);
    if(b%num==a||b==a){
        readerneed[c]=b;
        i++;
        j=1;
    }
    else readerneed[c]=-1;
}//寻找能否借到书
void prt(){
    for(i=1;i<=q;i++){
        if(readerneed[i]>=0) cout<<readerneed[i]<<endl;
        else cout<<"-1"<<endl;
    }
}//输出
int main(){
    cin>>n>>q;
    for(i=1;i<=n;i++){
        cin>>book[i];
        if(book[i]<=book[i-1]) swap(book[i],book[i-1]);  
    }
    sort(book,book+i+1);
    for(i=1;i<=q;i++){
        cin>>reader[i]>>readernum[i];
    }
    for(i=1;i<=q;i++) for(j=1;j<=n;j++) find(reader[i],readernum[i],book[j],i);
    prt();
}

by _200825_ @ 2024-08-20 10:53:22

测试点1,2,7未通过


by Emil_ @ 2024-08-20 10:53:51

@200825

详细注释:

#include <bits/stdc++.h>
using namespace std;
int n,q,lll;//舒服了!!!!!!!! ,lll存长度 
string a[1100],xxx;//xxx存需求码 
bool cmp(string a,string b){//判断大小,升序排序 
    if(a.size()!=b.size()){//长度不等,长的大 
        return a.size()<b.size();
    }else{
        return a<b;//长度相等,从首到尾判断大小 
    }
}
int main(){
    cin>>n>>q;
    for(int i=0;i<n;i++){
        cin>>a[i];
        for(int j=0;j<a[i].size();j++){
            a[i][j]-='0';
//          cout<<(int)a[i][j];
        }
//      cout<<endl;//看看转换对了吗
    } 
    sort(a,a+n,cmp);//升序排序,确保最先找到的是最小 
//  for(int i=0;i<n;i++){
//      for(int j=0;j<a[i].size();j++){
//          cout<<(int)a[i][j];
//      }
//      cout<<endl; //看看排序对了吗 
//  } 
    bool flag=true;
    for(int i=0;i<q;i++){//一个人一个人的边输入边找 
        flag=true;
        cin>>lll>>xxx;//输入一个找一个 
        for(int j=0;j<lll;j++){
            xxx[j]-='0';
//          cout<<(int)xxx[j];
        }
//      cout<<endl;//看看转换对了吗 
        for(int l=0;l<n;l++){//遍历每本书 
            for(int j=lll-1,k=0;j>=0;j--,k++){//从最后开始判断字符是否相等 
                if(a[l][a[l].size()-k-1]!=xxx[j]){
                    //不相等将flag改为false,退出循环 
                    flag=false;
                    break;
                }else{
                    flag=true;//否则还原为true 
                }
            }
            if(flag==true){
                //能进入这个if证明找到了书 
                for(int j=0;j<a[l].size();j++)
                    cout<<(int)a[l][j];//输出书 
                cout<<endl;
                break;//结束此人的找书过程 
            }
        }
        if(!flag)//若到最后找完了flag还为false,就输出-1 
            cout<<-1<<endl;
    }
    return 0;
}

by _200825_ @ 2024-08-20 10:56:28

@Emil_ 谢谢


|