• Parencedence! 夜


    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1947

    题意:

    给出一个表达式 然后两个人轮流对表达式进行操作 每一次操作就加一个括号将一个运算符和两边的数括起来运算 变成一个数(运算结果)

    第一个人希望最后结果越大越好  第二个人希望结果越小越好 两人轮流来

    第一次 第一个人先开始 得到的结果为 r1

    第二次 第二个人先开始 得到的结果为 r2

    如果 r1>(-r2) 第一个人胜利

    如果 r2<(-r2)第二个人胜利

    否则平局

    思路:

    dfs 搜索所有解空间 当该第一个人操作时 枚举括号加在哪里 取最大的结果

    该第二个人时 枚举括号加在哪里 取最小的结果 直到最后只有一个数(最后结果)

    考查:

    本题考查对dfs的理解和有关博弈的概念

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<vector>
    #include<stack>
    #include<set>
    #include<map>
    #include<queue>
    #include<algorithm>
    #include<cmath>
    #define LL long long
    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    using namespace std;
    const int INF=0x3f3f3f3f;
    //const int MOD=1000000009;
    const int N=35;
    int r1[N],r2[N];
    int a[N];
    char c[N];
    vector<int>vta;
    vector<char>vtc;
    int dfs(int x,int k)
    {
        int tmp=0;
        int x1=vta[x],x2=vta[x+1];
        char c1=vtc[x];
        if(c1=='+')
        tmp=x1+x2;
        if(c1=='-')
        tmp=x1-x2;
        if(c1=='*')
        tmp=x1*x2;
        if(vtc.size()==1)
        return tmp;
        vta.erase(vta.begin()+x);
        vta[x]=tmp;
        vtc.erase(vtc.begin()+x);
        int m=-1;
        for(unsigned int i=0;i<vtc.size();++i)
        {
            if(m==-1)
            m=dfs(i,k^1);
            else
            {
                if(k==0)
                m=max(m,dfs(i,k^1));//cout<<"max"<<endl;}
                else
                m=min(m,dfs(i,k^1));//cout<<"min"<<endl;}
            }
        }
        vta[x]=x2;
        vta.insert(vta.begin()+x,x1);
        vtc.insert(vtc.begin()+x,c1);
        return m;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int T;
        cin>>T;
        for(int ca=1;ca<=T;++ca)
        {
           printf("Case %d:\n",ca);
           int n;
           cin>>n;
           vta.clear();
           vtc.clear();
           for(int i=0;i<=n;++i)
           {
               if(i>0)
               {cin>>c[i-1];vtc.push_back(c[i-1]);}
               cin>>a[i];vta.push_back(a[i]);
           }
           int l1=-1;
           for(int i=0;i<n;++i)
           {
               r1[i]=dfs(i,1);
               //cout<<i<<" "<<r1[i]<<endl;
               if(l1==-1||r1[l1]<r1[i])
               l1=i;
           }
           int l2=-1;
           for(int i=0;i<n;++i)
           {
               r2[i]=dfs(i,0);
               //cout<<i<<" "<<r2[i]<<endl;
               if(l2==-1||r2[l2]>r2[i])
               l2=i;
           }
           printf("Player 1 (%d%c%d) leads to %d\n",a[l1],c[l1],a[l1+1],r1[l1]);
           printf("Player 2 (%d%c%d) leads to %d\n",a[l2],c[l2],a[l2+1],r2[l2]);
           if(r1[l1]>(-r2[l2]))
           printf("Player 1 wins\n");
           else if(r1[l1]<(-r2[l2]))
           printf("Player 2 wins\n");
           else
           printf("Tie\n");
        }
        return 0;
    }
    

      

  • 相关阅读:
    活动安排问题
    CodeForces
    HDU
    HDU
    HihoCoder
    二分签到题--二分入门
    并查集,最小生成树
    spark和 mapreduce的比较
    SparkSQL--数据源Parquet的加载和保存
    SparkSQL -DataFrame与RDD的互转
  • 原文地址:https://www.cnblogs.com/liulangye/p/2887280.html
Copyright © 2020-2023  润新知