A. Alice the Fan

Solved.

题意:

两个人打网球,要求teamA 的得分与其他队伍拉开尽量大

输出合法的方案

思路:

 $dp[i][j][k][l] 表示 A 赢i局,其他队伍赢j局,两个人比分为k : l 的时候的方案$

  1 #include<bits/stdc++.h>
  2 
  3 using namespace std;
  4 
  5 int dp[5][5][210][210];
  6 vector<pair<int, int> >out[5][5][210][210];
  7 
  8 void Init()
  9 {
 10     dp[0][0][0][0] = 1;
 11     for(int sum = 0; sum <= 4; ++sum)
 12     {
 13         for(int l = 0; l <= sum; ++l)
 14         {
 15             for(int i = 0; i <= 200; ++i)
 16             {
 17                 for(int j = 0; j <= 200; ++j)
 18                 {
 19                     int r = sum - l;
 20                     if(!dp[l][r][i][j]) continue;
 21                     if(max(l, r) >= 3) continue;
 22                     int limit = 25;
 23                     if(sum == 4) limit = 15;
 24                     for(int tmp = limit; tmp <= 200; ++tmp)
 25                     {
 26                         if(i + tmp <= 200 && j + tmp - 2 <= 200 && !dp[l + 1][r][i + tmp][j + tmp - 2])
 27                         {
 28                             dp[l + 1][r][i + tmp][j + tmp - 2] = 1;
 29                             out[l + 1][r][i + tmp][j + tmp - 2] = out[l][r][i][j];
 30                             out[l + 1][r][i + tmp][j + tmp - 2].push_back(make_pair(tmp, tmp - 2));
 31                         }
 32                         if(i + tmp - 2 <= 200 && j + tmp <= 200 && !dp[l][r + 1][i + tmp - 2][j + tmp])
 33                         {
 34                             dp[l][r + 1][i + tmp - 2][j + tmp] = 1;
 35                             out[l][r + 1][i + tmp - 2][j + tmp] = out[l][r][i][j];
 36                             out[l][r + 1][i + tmp - 2][j + tmp].push_back(make_pair(tmp - 2, tmp));
 37                         }
 38                     }
 39 
 40                     for(int tmp = 0; tmp <= limit - 2; ++tmp)
 41                     {
 42                         if(i + limit <= 200 && j + tmp <= 200 && !dp[l + 1][r][i + limit][j + tmp])
 43                         {
 44                             dp[l + 1][r][i + limit][j + tmp] = 1;
 45                             out[l + 1][r][i + limit][j + tmp] = out[l][r][i][j];
 46                             out[l + 1][r][i + limit][j + tmp].push_back(make_pair(limit, tmp));
 47                         }
 48                         if(i + tmp <= 200 && j + limit <= 200 && !dp[l][r + 1][i + tmp][j + limit])
 49                         {
 50                             dp[l][r + 1][i + tmp][j + limit] = 1;
 51                             out[l][r + 1][i + tmp][j + limit] = out[l][r][i][j];
 52                             out[l][r + 1][i + tmp][j + limit].push_back(make_pair(tmp, limit));
 53                         }
 54                     }
 55                 }
 56             }
 57         }
 58     }
 59 }
 60 
 61 int a, b;
 62 
 63 int main()
 64 {
 65     Init();
 66     int t;
 67     scanf("%d", &t);
 68     while(t--)
 69     {
 70         scanf("%d %d", &a, &b);
 71         int l = -1, r = -1;
 72         if(dp[3][0][a][b])
 73         {
 74             l = 3;
 75             r = 0;
 76         }
 77         else if(dp[3][1][a][b])
 78         {
 79             l = 3;
 80             r = 1;
 81         }
 82         else if(dp[3][2][a][b])
 83         {
 84             l = 3;
 85             r = 2;
 86         }
 87         else if(dp[2][3][a][b])
 88         {
 89             l = 2;
 90             r = 3;
 91         }
 92         else if(dp[1][3][a][b])
 93         {
 94             l = 1;
 95             r = 3;
 96         }
 97         else if(dp[0][3][a][b])
 98         {
 99             l = 0;
100             r = 3;
101         }
102         if(l == -1 && r == -1)
103         {
104             puts("Impossible");
105         }
106         else
107         {
108             printf("%d:%d\n", l, r);
109             int len = out[l][r][a][b].size();
110             for(int i = 0; i < len; ++i) printf("%d:%d%c", out[l][r][a][b][i].first, out[l][r][a][b][i].second, " \n"[i == len - 1]);
111         }
112     }
113     return 0;
114 }
View Code

相关文章: