• 正睿提高组2017模拟题七T2


    说到这题,我得感谢一下出题人的仁慈,n=100的分高达90,因为题目标算为O(1)...

    我首先想到的是dp,用dp[i][j][k]表示Jack在i,Rose在j,k这个人选择接下来要走的这一步的这个状态下,Jack的金钱与Rose的金钱的差值。

    如果k=0表示Jack选择,k=1Rose选择

    dp方程很显然

    dp[i][j][0]=max(dp[i+1][j][1]+a[i],dp[i][j-1][1]-a[j]);

    dp[i][j][1]=min(dp[i+1][j][0]+a[i],dp[i][j-1][0]-a[j]);

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int t,a[10009],n,dp[7009][7009][2];
    int main()
    {
      scanf("%d",&t);
      while (t--)
      {
          scanf("%d",&n);
          for (int i=1;i<=n;i++) scanf("%d",&a[i]);
          for (int len=2;len<=n;len++)
          for (int i=1;i<=n-len+1;i++)
          {
            int j=i+len-1;
            dp[i][j][0]=max(dp[i+1][j][1]+a[i],dp[i][j-1][1]-a[j]); 
            dp[i][j][1]=min(dp[i+1][j][0]+a[i],dp[i][j-1][0]-a[j]);
        }
        if (dp[1][n][0]==0) printf("tie
    ");
        else if (dp[1][n][0]>0) printf("win
    ");
        else printf("lose
    "); 
      }
      return 0;
    } 

    然而这么写的话空间和时间都是n^2的。。。。能过90分。。

    结果看了一下你会发现,假设mid=n/2+1,最后的位置可以被两人控制在mid-1,mid,和mid+1这三个位置上(如果n是奇数的话),所以只要分别计算在这几个位置上的金钱,然后分类讨论一下就好了。。。具体程序写。。。

    感觉自己好弱。。

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int t,sum[10009],a[10009],n,x,y,lef,righ,mid;
    int main()
    {
      scanf("%d",&t);
      while (t--)
      {
          scanf("%d",&n);
          for (int i=1;i<=n;i++) 
        {
          scanf("%d",&a[i]);
          sum[i]=sum[i-1]+a[i];
        }
        mid=n/2+1;lef=sum[mid];righ=sum[n]-sum[mid-1];
           if(n%2!=0)
        {
          x=lef-a[mid]-(righ+a[mid-1]);y=lef+a[mid+1]-(righ-a[mid]);
          if (lef>righ)
          {
              if ((x>0)||(y>0)) puts("win
    ");
    //只要中间位置为胜,左右两边有任意一个位置为胜,那么最终就能为胜。
              else if ((x==0)||(y==0)) puts("tie
    ");
            else puts("lose
    "); 
          }
          if (lef==righ)
          {
              if ((x>=0)||(y>=0)) puts("tie
    ");
    //只要有任意一边不为输,那么最终结果就为平局。
              else puts("lose
    ");
          }
          if (lef<righ) puts("lose
    ");
        } 
        mid=n/2+1;lef=sum[mid];righ=sum[n]-sum[mid-1]; 
        if (n%2==0)
        {
          x=lef-a[mid]-(righ+a[mid-1]);y=lef-righ;
          if ((x>0)||(y>0)) puts("win
    ");
          else if ((x==0)||(y==0)) puts("tie
    ");
          else puts("lose
    ");
        }
      }
      return 0;
    } 
  • 相关阅读:
    Echarts饼图页面加载后默认凸出某块
    垂直居中及水平垂直居中方案(共15种)
    CSS Flex布局
    iview04
    重写react-navigation的stackNaviagtor产生的默认导航栏header样式
    RN 去掉Text组件文本的内边距
    RN项目导入到 最新的Android studio
    React Native 设置APP名称、logo图标、启动页
    react native 规避8081端口被占用,同时运行多个RN项目
    Android studio 的SDK默认安装路径找不到AppData文件
  • 原文地址:https://www.cnblogs.com/2014nhc/p/7641588.html
Copyright © 2020-2023  润新知