BUPT kamiyoru's training #1 codeforces#486div.3

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Myriad_Dreamin/article/details/80727971

A - Diverse Team

签到题就不多说了。

#include <cstdio>
int find[105];
int main(){
    int n,k,distinc=0,a;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a);
        if(!find[a]){find[a]=i;distinc++;}
    }
    puts(distinc>=k?"YES":"NO");
    if(distinc>=k){
        for(int i=1;i<=100&&k;i++){
            if(find[i])printf("%d ",find[i]),k--;
        }
    }
}

B - Substrings Sort

题目已经提示得很明显了,把字符串排序一下,如果 S t r [ i ] 不在 S t r [ i + 1 ] 里,那么就不符合题意。

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string a[105];
bool cmp(string x,string y){
    int a=x.length(),b=y.length();
    if(a!=b)return a<b;
    return x<y;
}
int main(){
    int n;
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n,cmp);
    for(int i=1;i<n;i++){
        if(a[i+1].find(a[i])==string::npos){
            cout<<"NO";
            return 0;
        }
    }
    cout<<"YES"<<endl;
    for(int i=1;i<=n;i++){
        cout<<a[i]<<endl;
    }
}

C - Equal Sums

用map记录 s u m [ i ] s [ i ] [ j ] 的值,由于 n i 2 10 5 ,所以这样做是可行的。

#include <cstdio>
#include <cctype>
#include <map>
#include <utility>
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char GET_CHAR(){
    if(head==tail){
        int l=fread(buffer,1,BufferSize,stdin);
        tail=(head=buffer)+l;
        if(head==tail)return EOF;
    }
    return *head++;
}
inline int READ(){
    int x=0,f=1;char c=GET_CHAR();
    for(;!isdigit(c);c=GET_CHAR()){
        if(c==EOF)return EOF;
        if(c=='-')f=-1;
    }
    for(;isdigit(c);c=GET_CHAR())x=(((x<<2)+x)<<1)+c-'0';
    return x*f;
}
typedef pair<int,int> pii;
map<int,pii> find;
int ni,a[200005],sum;
int main(){
    int n=READ();
    for(int i=1;i<=n;i++){
        ni=READ();
        sum=0;
        for(int j=1;j<=ni;j++){
            a[j]=READ();
            sum+=a[j];
        }
        for(int j=1;j<=ni;j++){
            if(find.count(sum-a[j])){
                pii ans=find[sum-a[j]];
                printf("YES\n%d %d\n%d %d\n",ans.first,ans.second,i,j);
                return 0;
            }
        }
        for(int j=1;j<=ni;j++){
            find[sum-a[j]]=make_pair(i,j);
        }
    }
    puts("NO");
}

D - Points and Powers of Two

稍微写一下就会知道这样的集合元素一共不会超过三个,了解这个就可做了。

#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
map<int,bool> ref;
int a[200005];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        ref[a[i]]=1;
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        for(int bit=0;bit<32;bit++){
            if(ref.count(a[i]+(1<<bit))&&ref.count(a[i]+(1<<(bit+1)))){
                printf("3\n%d %d %d",a[i],a[i]+(1<<bit),a[i]+(1<<(bit+1)));
                return 0;
            }
            if(a[i]+(1<<bit)>a[n]||a[i]+(1<<(bit+1))>a[n])break;
        }
    }
    for(int i=1;i<=n;i++){
        for(int bit=0;bit<32;bit++){
            if(ref.count(a[i]+(1<<bit))){
                printf("2\n%d %d",a[i],a[i]+(1<<bit));
                return 0;
            }
            if(a[i]+(1<<bit)>a[n])break;
        }
    }
    printf("1\n%d",a[1]);
}
/*
3
-1 -10 -50
 */

E - Divisibility by 25

简单搜索,把不需要考虑的字符用相同字符代替可以极大减小搜索空间。

#include <cstdio>
#include <string>
#include <utility>
#include <map>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
queue<pair<string,int> >Q;
map<string,bool> geted;
string ss;
int getf[500],dic[500],p[500];
int rp='0'*11;
int bfs(){
    if(ss.size()==2&&getf[ss[0]*10+ss[1]-rp])return 0;
    pair<string,int> tmp;
    int step,len=ss.size();
    for(int i=len-1;i>=0;i--){
        if(p[7]&&ss[i]=='7')ss[i]='9'+1;
        if(p[5]&&ss[i]=='5')ss[i]='9'+1;
        if(p[2]&&ss[i]=='2')ss[i]='9'+1;
        if(p[1]&&ss[i]=='1')ss[i]='9'+1;
        p[ss[i]-'0']++;
    }
    //cout<<ss<<endl;
    if(!((p[0]>=2)||(p[2]&&p[5])||(p[5]&&p[0])||(p[7]&&p[5])))return -1;
    Q.push(make_pair(ss,0));
    while(Q.size()){
        tmp=Q.front();Q.pop();
        step=tmp.second;
        string &s=tmp.first;
        //cout<<s[len-1]+s[len-2]*10-rp<<" "<<s<<endl;
        if(getf[s[len-1]+s[len-2]*10-rp])return step;
        if(s[1]!='0'){
            if(dic[s[0]-'0']){
                swap(s[0],s[1]);
                if(!geted[s]){
                    Q.push(make_pair(s,step+1));
                    geted[s]=1;
                    //cout<<s<<" "<<step<<endl;
                }
                swap(s[0],s[1]);
            }
        }
        for(int i=2;i<len;i++){
            if(!dic[s[i-1]-'0'])continue;
            swap(s[i],s[i-1]);
            if(!geted.count(s)){
                Q.push(make_pair(s,step+1));
                geted[s]=1;
                //cout<<s<<" "<<step<<endl;
            }
            swap(s[i],s[i-1]);
        }
    }
    return -1;
}
int main(){
    dic[0]=dic[2]=dic[5]=dic[7]=1;
    getf[25]=getf[50]=getf[75]=getf[0]=1;
    long long n;
    scanf("%I64d",&n);
    while(n){ss.push_back(n%10+'0');n/=10;}
    reverse(ss.begin(),ss.end());
    printf("%d",bfs());
}

猜你喜欢

转载自blog.csdn.net/Myriad_Dreamin/article/details/80727971
今日推荐