20 pts 求调,玄 2 关
查看原帖
20 pts 求调,玄 2 关
1121230
zheng_zx楼主2023/12/28 13:56

rt.

#include<bits/stdc++.h>
using namespace std;
struct node{
	int a, b;
	node(int x, int y){a = x, b = y;}
};
int d[5][5][210][210], T;
vector<node> v[5][5][210][210];
void init(){
	d[0][0][0][0] = 1;
	for(int sum = 0; sum <= 4; sum++)
	    for(int l = 0; l <= sum; l++){
	    	int r = sum - l;
    		int k = 25;
    		if(sum == 4) k = 15;
    		if(max(l, r) >= 3) continue;
    		for(int i = 0; i <= 200; i++)
     		    for(int j = 0; j <= 200; j++){		
		    	    if(!d[l][r][i][j]) continue;
			        for(int p = k; p <= 200; p++){
				        if(i + p <= 200 && j + p - 2 <= 200 && !d[l + 1][r][i + p][j + p - 2]){
					    d[l + 1][r][i + p][j + p - 2] = 1;
					    v[l + 1][r][i + p][j + p - 2] = v[l][r][i][j];
					    v[l + 1][r][i + p][j + p - 2].push_back(node(p, p - 2));
				    }
				if(i + p - 2 <= 200 && j + p <= 200 && !d[l][r + 1][i + p - 2][j + p]){
					d[l][r + 1][i + p - 2][j + p] = 1;
					v[l][r + 1][i + p - 2][j + p] = v[l][r][i][j];
					v[l][r + 1][i + p - 2][j + p].push_back(node(p - 2, p));
				}
			}
			for(int p = 0; p <= k - 2; p++){
				if(i + k <= 200 && j + p <= 200 && !d[l + 1][r][i + k][j + p]){
					d[l + 1][r][i + k][j + p] = 1;
					v[l + 1][r][i + k][j + p] = v[l][r][i][j];
					v[l + 1][r][i + k][j + p].push_back(node(k, p));
				}
				if(i + p <= 200 && j + k <= 200 && !d[l][r + 1][i + p][j + k]){
					d[l][r + 1][i + p][j + k] = 1;
					v[l][r + 1][i + p][j + k] = v[l][r][i][j];
					v[l][r + 1][i + p][j + k].push_back(node(p,k));
				}
			}
		}
	}
}
int main(){
	init();
	scanf("%d",&T);
	while(T--){
		int a, b, l = -1, r = -1;
		scanf("%d%d", &a, &b);
		if(d[3][0][a][b]) l = 3, r = 0;
		else if(d[3][1][a][b]) l = 3, r = 1;
		else if(d[3][2][a][b]) l = 3, r = 2;
		else if(d[2][3][a][b]) l = 2, r = 3;
		else if(d[1][3][a][b]) l = 1, r = 3;
		else if(d[0][3][a][b]) l = 0, r = 3;
		if(l == -1) puts("Impossible");
		else{
			printf("%d:%d\n", l, r);
			printf("%d:%d", v[l][r][a][b][0].a, v[l][r][a][b][0].b);
			for(int i = 1; i < v[l][r][a][b].size(); i++)
			printf(" %d:%d ", v[l][r][a][b][i].a, v[l][r][a][b][i].b);
			puts(""); 
		}
	}
	return 0;
}
2023/12/28 13:56
加载中...