【枚舉】牛課網枚舉專題

1、手機號碼
題目鏈接

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<string.h>
using namespace std;
typedef long long ll;
string s1[1100],s2[1100];
ll book[1100];
ll ans=0,n,m;
bool cmp(string ss1,string ss2){
    return ss1<ss2;
}
ll sum(ll n){
    ll tmp=1;
    for(ll i=0;i<n;i++){
        tmp=tmp*10;
    }
    return tmp;
}
bool judge(string s1,string s2){
    int len1=s1.length();
    int len2=s2.length();
    if(len1>len2) return false;
    for(int i=0;i<len1;i++){
        if(s1[i]!=s2[i]){return false;}
    }
    return true;
}
int main(){
    std::ios::sync_with_stdio(false);
    memset(book,0,sizeof(book));
    cin>>n>>m;
    ans=sum(n);

    for(int i=0;i<m;i++){
        cin>>s1[i];
        s2[i]=s1[i];
    }
    sort(s1,s1+m,cmp);
    for(int i=0;i<m;i++){
        for(int j=i+1;j<m;j++){
            if(judge(s1[i],s1[j])) { book[j]=1;} //前綴
        }
    }
    for(int i=0;i<m;i++){
        if(book[i]==0){
           // cout<<i<<" "<<sum(n-s1[i].length())<<endl;
            ans=ans-sum(n-s1[i].length());
        }
    }
    cout<<ans<<endl;
    return 0;
}

2、字符串的旋轉和追加

題目鏈接
分析:倒過來思考會簡單很多,不要想着怎樣從A到B,想着從B向A推,最後判斷兩者是否相等會簡單很多。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
string s1,s2;
//末尾是A
void add1(string &s2){
    int len=s2.length()-1;
    string s;
    for(int i=0;i<len;i++){
        s+=s2[i];
    }
    s2=s;
}
//末尾是B
void add2(string &s2){
    int len=s2.length()-1;
    string s;
    for(int i=len-1;i>=0;i--){
        s+=s2[i];
    }
    s2=s;
}
int main(){
    std::ios::sync_with_stdio(false);
    cin>>s1>>s2;
    int len1=s1.length();
    int len2=s2.length();
    if(len1>len2){cout<<"Impossible"<<endl;}
    else{
        int cnt=len2;
        while(cnt!=len1){
            if(s2[cnt-1]=='A'){add1(s2);}
            else{add2(s2);}
            cnt--;
        }
        //cout<<s1<<" "<<s2<<endl;
        if(s2==s1){cout<<"Possible"<<endl;}
        else {cout<<"Impossible"<<endl;}
    }
    return 0;
}

3、判斷是不是正方形
思路:算出六條邊,倘若四條邊相等,另外兩條邊相同,那麼就是正方形。
題目

#include<iostream>
#include<algorithm>
using namespace std;
int x[1100],y[1100];
int solve(int x,int y,int xx,int yy){
    return (xx-x)*(xx-x)+(yy-y)*(yy-y);
}
int main(){
    std::ios::sync_with_stdio(false);
    for(int i=0;i<4;i++){cin>>x[i];}
    for(int i=0;i<4;i++){cin>>y[i];}
    int ans[2100];
    for(int i=0;i<4;i++){
        if(i<=2){
            ans[i]=solve(x[i],y[i],x[i+1],y[i+1]);
        }
        else{
            ans[i]=solve(x[3],y[3],x[0],y[0]);
        }
    }
    ans[4]=solve(x[0],y[0],x[2],y[2]);
    ans[5]=solve(x[1],y[1],x[3],y[3]);
    sort(ans,ans+6);
    if(ans[0]==ans[1]&&ans[1]==ans[2]&&ans[2]==ans[3]&&ans[4]==ans[5]){
        cout<<"It's a square"<<endl;
    }
    else{
        cout<<"Not a square"<<endl;
    }
    return 0;
}

4、均分糖果
模擬
題目鏈接

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[11000];
int n;
int main()
{
    std::ios::sync_with_stdio(false);
    while(cin>>n){
        int sum=0;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++) {cin>>a[i];sum+=a[i];}
        int ave=sum/n;
        int cnt=0;
        for(int i=0;i<n;i++){
            if(a[i]!=ave){
                cnt++;
                a[i+1]+=(a[i]-ave);
            }
        }
        cout<<cnt<<endl;
    }

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章