zoukankan      html  css  js  c++  java
  • 【NOIP2010提高组】5.26校模拟

    世间唯有暴力与打表不可辜负。

    A. 【NOIP 2010 提高组】机器翻译

    没记错这题在LuoGu刷过,模拟一下就行这东西,毕竟T1(滑稽)

    #include<iostream>
    #include<queue>
    using namespace std;
    int m,n;
    int Count; 
    bool b[1111];
    int ans;
    queue <int> Q; 
    int main(){
        //freopen("translate.in","r",stdin);
        //freopen("translate.out","w",stdout);
        cin>>m>>n;
        int Putin;
        for(int i=1;i<=n;i++){
            cin>>Putin;
            if(b[Putin]){
                
            }
            else{
                ans++;
                if(Count<=m-1){
                    b[Putin]=true;
                    Count++;
                    Q.push(Putin);
                }
                else{
                    b[Q.front()]=false;
                    Q.pop();
                    b[Putin]=true;
                    Q.push(Putin);
                }
            }
        }
        cout<<ans;
    }

    B. 【NOIP 2010 提高组】乌龟棋

    考场先暴力,不要多BB。

    先给我搜他丫的。

    #include<iostream>
    #include<algorithm>
    //打表出省一,暴力出奇迹 
    using namespace std;
    long long Space[5000];
    long long Paper[5000];
    bool used[5000];
    long long n,m;
    long long ans;
    inline void DFS(long long Score,long long Pos){
        long long mychoice=0;
        Score+=Space[Pos];
        for(long long i=1;i<=m;i++){
            if(used[i]==false){
                used[i]=true;
                mychoice=i;
                DFS(Score,Pos+Paper[i]);
                used[mychoice]=false;
            }
        }
        ans=max(ans,Score);
    }
    int main(){
        //freopen("tortoise.in","r",stdin);
        //freopen("tortoise.out","w",stdout);
        cin>>n>>m;
        for(long long i=1;i<=n;i++){
            cin>>Space[i];
        }
        for(long long i=1;i<=m;i++){
            cin>>Paper[i];    
        }
        sort(Paper+1,Paper+1+m);
        DFS(0,1);
        cout<<ans;
    }

    然后搜了个20(多捞哦!!!!不够大力吗??

    搜一波LuoGu题解…哇。四维数组。看一眼题目数据范围就懂了,疯狂暗示系列么。

    各种出牌方法一个一个折腾,一直取最大值。在输入的时候就把每张手牌的个数存好(有点像背包??)

    #include<iostream>
    using namespace std;
    const int MAXN=50;
    //思路来源:洛谷题解。已理解并脱离题解重写 
    int Step[500];
    int Card[MAXN][MAXN][MAXN][MAXN];
    int Number[MAXN];
    int n,m;
    int main(){
        int Index;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>Step[i];
        }
        for(int i=1;i<=m;i++){
            cin>>Index;
            Number[Index]++;
        }
    
        Card[0][0][0][0]=Step[1];
        for(int a=0;a<=Number[1];a++){
            for(int b=0;b<=Number[2];b++){
                for(int c=0;c<=Number[3];c++){
                    for(int d=0;d<=Number[4];d++){
                    if(a!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a-1][b][c][d]+Step[1+a+b*2+c*3+d*4]);
                    if(b!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b-1][c][d]+Step[1+a+b*2+c*3+d*4]);
                    if(c!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c-1][d]+Step[1+a+b*2+c*3+d*4]);
                    if(d!=0)    Card[a][b][c][d]=max(Card[a][b][c][d],Card[a][b][c][d-1]+Step[1+a+b*2+c*3+d*4]);
                    }
                }
            }
        }
        cout<<Card[Number[1]][Number[2]][Number[3]][Number[4]];
    }

    C. 【NOIP 2010 提高组】关押罪犯

     看到题目画好的图说实话有并查集的想法,但无奈思维还停滞在普及组,觉得应该用不到并查集。于是乎,暴力了…

    #include<iostream>
    #include<vector> 
    using namespace std;
    //打表出省一,暴力出奇迹
    const int MAXN=20010;
    const int INF=1e9;
    int n,m;
    vector <int> A;
    vector <int> B;
    int dp[MAXN][MAXN];
    int ans;
    inline void DFS(int x,int c){
    //    for(int i=0;j<A.size();j++){
    //        cout<<A[i];
    //    }
        if(c>ans){
            return;
        }
        if(x==n+1){
            //cout<<"now the c is "<<c<<endl;
            ans=min(c,ans);
            return;
        }
        int MAXA,MAXB;
        MAXA=MAXB=0;
        for(int j=0;j<A.size();j++){
            MAXA=max(MAXA,dp[x][A[j]]);
        }
        for(int j=0;j<B.size();j++){
            MAXB=max(MAXB,dp[x][B[j]]);
        }
        A.push_back(x);
        DFS(x+1,max(c,MAXA));
        A.pop_back();
        B.push_back(x);
        DFS(x+1,max(c,MAXB));
        B.pop_back();    
    }
    int main(){
        //freopen("prison.in","r",stdin);
    //    freopen("prison.out","w",stdout);
        cin>>n>>m;
        int x,y,c;
        ans=INF;
        for(int i=1;i<=m;i++){
            cin>>x>>y>>c;
            dp[x][y]=c;
            dp[y][x]=c;
        }
        DFS(1,0);
        cout<<ans;
    }

    尽管Vector都玩起来了,依然有爆炸现象(当然还有TLE

    然后看到LuoGu某大佬天秀思路。把怒气值排序,把敌人的敌人与我关进牢笼。关不进去就是程序终点。完全没有任何毛病并且实现简单清晰明了。

    #include<iostream>
    #include<algorithm>
    using namespace std;
    //思路源自洛谷,完全理解并脱离题解重写。 
    const int MAXN=20500;
    int a[MAXN];
    struct relation{
        int prisonA;
        int prisonB;
        int FireIndex;
    }Ships[100400];
    int n,m;
    int Enemy[MAXN];
    inline int find(int x){
        if(a[x]==x){
            return x;
        }
        a[x]=find(a[x]);
        return a[x];
    }
    inline bool check(int x,int y){
        if(find(a[x])==find(a[y])){
            return true;
        }
        return false;
    }
    inline bool Ruler(const relation &a,const relation &b){
        return a.FireIndex>b.FireIndex;
    }
    inline void merge(int x,int y){
        x=find(a[x]);
        y=find(a[y]);
        a[x]=y;
    }
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            a[i]=i;
        }
        for(int i=1;i<=m;i++){
            cin>>Ships[i].prisonA>>Ships[i].prisonB>>Ships[i].FireIndex;
        }
        sort(Ships+1,Ships+1+m,Ruler);
        for(int i=1;i<=m+1;i++){
            if(i==m+1){
                cout<<0;
                return 0;
            }
            if(check(Ships[i].prisonA,Ships[i].prisonB)){
                cout<<Ships[i].FireIndex;
                return 0;
            }
            else{
                if(Enemy[Ships[i].prisonA]==0){
                    Enemy[Ships[i].prisonA]=Ships[i].prisonB;
                }
                else{
                    merge(Enemy[Ships[i].prisonA],Ships[i].prisonB);
                }
                if(Enemy[Ships[i].prisonB]==0){
                    Enemy[Ships[i].prisonB]=Ships[i].prisonA;
                }
                else{
                    merge(Enemy[Ships[i].prisonB],Ships[i].prisonA);
                }
            }
        } 
    } 

    Orz…太棒了。

    D. 【NOIP 2010 提高组】引水入城

  • 相关阅读:
    flask
    admin站点管理
    DRF
    基础
    通过djangocrontab扩展来实现 定时任务
    配置asgi来达到能处理websocket
    用es实现模糊搜索
    迁移问题
    启动活动的最佳写法
    启动活动的最佳写法
  • 原文地址:https://www.cnblogs.com/Uninstalllingyi/p/10939615.html
Copyright © 2011-2022 走看看