CF AIM Tech Round 3 (Div. 2) D

模拟

首先可以求出 0 和 1 的个数

之后按照01 10 的个数贪心安排

细节太多 错的都要哭了

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a,b,c,d;
	while(~scanf("%d %d %d %d",&a,&b,&c,&d)) {
		int suc = 1;

		int t1,t2;
		t1 = sqrt(2*a); t2 = sqrt(2*d);
		t1 ++; t2 ++;
		if(t1*(t1-1) != 2*a || t2*(t2-1) != 2*d) suc = 0;


		if(d == 0) {
			if(!suc) printf("Impossible
");
			else if(b == 0 && c == 0) {
				for(int i = 0; i < t1; ++i) printf("0"); printf("
");
			}else if(b+c == t1) {
				if(t1 == 1) {
					if(b) printf("01
");
					else printf("10
");
					continue;
				}
				int cc = 0;
				if(cc == b) printf("1");
				for(int i = 0; i < t1; ++i) {
					printf("0");
					cc ++;
					if(cc == b) printf("1");
				} printf("
");
			}
			else printf("Impossible
");
			continue;
		}else if(a == 0) {
			if(!suc) printf("Impossible
");
			else if(b == 0 && c == 0) {
				for(int i = 0; i < t2; ++i) printf("1"); printf("
");
			}else if(b+c == t2) {
				int cc = 0;
				if(cc == c) printf("0");
				for(int i = 0; i < t2; ++i) {
					printf("1"); cc ++;
					if(cc == c) printf("0");
				} printf("
");
			}
			else printf("Impossible
");
			continue;
		}
		
		if(b+c != t1*t2) suc = 0;
		int num1 = 0, pos1 = 0;
		num1 = c/t1; pos1 = c%t1;
		int all = num1 + (pos1 > 0);
		if(all > t2) suc = 0;

		if(suc) {
			for(int i = 0; i < num1; ++i) printf("1");
			int cc = t1;
			for(int i = 0; i < t1; ++i) {
				cc --;
				printf("0");
				if(cc == pos1 && cc != 0) printf("1");  
			}
			for(int i = 0; i < t2-all; ++i) printf("1"); printf("
");
		}
		else printf("Impossible
");
	}
	return 0;	
}


原文地址:https://www.cnblogs.com/Basasuya/p/8433757.html