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 }