codeforces #644(div3) A-G题解

A. Minimal Square

找一个最小的正方形,包含两个a*b的矩形,两矩形无交叉。

  • 设较小的数为a,较大的数为b。则正方形边长为:max(2 * a, b)
	cin >> t;
	while(t--){
		cin >> a >> b;
		if(a > b) swap(a,b);
		if(2 * a >= b) ans = 4 * a * a;
		else ans = b * b;
		cout << ans << endl;
	}
B. Honest Coach

n个数,分为a,b两组,每组至少一个数字。分组满足:|max_a - min_b|值最小

  • 将数组排序,寻找最小的相邻元素差的绝对值
	cin >> t;
	while(t--){
		cin >> n;
		vector<int> s(n);
		for(int i = 0; i < n; i++) cin >> s[i];
		ans = inf;
		sort(s.begin(), s.end());
		for(int i = 0; i < n - 1; i++) ans = min(ans, s[i + 1] - s[i]);
		cout << ans << endl;
	} 
C. Similar Pairs

x,y相似:1. 同奇偶;2.|x - y| == 1。数组a中包含n个数字,判断数组中的这些元素是否可以全部组成(x,y)这样的数对。

  1. 均为奇数or偶数 -- YES

  2. 奇偶数均为偶数个 -- YES

  3. 奇偶数均为奇数个且存在一组以上的元素满足|x - y| == 1,抛开一组|x - y| == 1,其余元素为情况2 -- YES(排序,搜索)

  4. 其它 -- NO

	cin >> t;
	while(t--){
		b[0] = b[1] = 0;//统计奇偶数个数 
		cin >> n;
		for(int i = 0; i < n; i++){
			cin >> a[i];
			++b[a[i] & 1];
		}
		if(b[0] == n || b[1] == n || !(b[0] & 1)) cout << "YES" << endl;
		else{
			bool flag = false;
			sort(a, a + n);
			for(int i = 0; i < n - 1; i++){
				if(a[i] == a[i + 1] - 1){
					flag = true;
					break;
				}
			} 
			if(flag) cout << "YES" << endl;
			else cout << "NO" << endl; 
		}
	}
D. Buying Shovels

购买n个物品,商品有k类,每一类中有 i 个物品,1 <= i <= k。只能购买一类商品, 满足条件:恰好买n个物品;商品个数最小。

  • n <= k, i = n,一件即可;
  • n > k,寻找n 的因子中 <= k的最大值 ,件数 = n / 最大de可选因子
	cin >> t;
	while(t--){
		cin >> n >> k;
		if(n <= k) cout << "1" << endl;
		else{
			x = 1;//质数选1
			for(int i = 2; i * i <= n && i <= k; i++){//k可能 <= sqrt(n)
				if(n % i == 0){
					x = i;
					if(n / i <= k){
                                            x = n / i;
                                            break;
                                      }
				}
			}
			cout << n / x << endl;
		}
	}
E. Polygon

询问输入的矩阵可否由全0矩阵得到。修改方式:在n*n的全0阵的最左边和最上边存在2n门炮,每次最多可使用一门炮,直线发射1,直到边界或下一位是1停下来修改当前的0为1。

  • 除去右、下边界之外,其余位置的1在下方或者右方存在1才可!
int t,n;
string g[55];
bool judge(int r){
	for(int i = 0; i < n - 1; i++){
		if(g[r][i] == '1' && g[r][i + 1] != '1' && g[r + 1][i] != '1') return false;
	}
	return true;
}
int main(void){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> t;
	while(t--){
		bool flag = true;
		cin >> n;
		for(int i = 0; i < n; i++) cin >> g[i];
		for(int i = 0; i < n - 1; i++){//判断除下边界外的每一行
			if(!judge(i)){
				flag = false;
				break;
			}
		} 
		if(flag) cout << "YES" << endl;
		else cout << "NO" << endl; 
	}
	return 0;
} 
F. Spy-string

n个长为m的字符串。能否构造一个字符串s,使s与这些字符串中的每一个最多有一个字符不同。

  • s存在,则与s[0]最多有一个字符不同

  • 取s[0],枚举它的所有可能de变化(每次只改变一个字符),与其它的字符串一一比较

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define endl '\n'
using namespace std;
int t,n,m;
string cur,s[11];
bool judge(string a){
	for(int i = 1; i < n; i++){
		int sum = 0;
		for(int j = 0; j < m && sum < 2; j++){
			if(a[j] != s[i][j]) ++sum;//最多一个字符不同
		}
		if(sum == 2) return false;
	}
	return true;
}
int main(void){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> t;
	while(t--){
		bool flag = false;
		cin >> n >> m;
		for(int i = 0; i < n; i++) cin >> s[i];
		if(judge(s[0])){//s[0]是否满足条件 
			cout << s[0] << endl;
			continue;
		}
		for(int i = 0; i < m && !flag; i++){
			cur = s[0];
			for(int j = 0; j < 26; j++){
				if('a' + j == s[0][i]) continue;
				cur[i] = 'a' + j;
				if(judge(cur)){
					flag = true;
					break;
				}
			}
		}
		if(flag) cout << cur << endl;
		else cout << "-1" << endl;
	}
	return 0;
} 
G. A/B Matrix

构造一个01矩阵,满足:n行,m列,每一行a个1,每一列b个1。

  • n * a == m * b,说明可以构造出这样的矩阵
  • 从第一行开始,每行接着上一行最后一个位置开始赋1,循环即可
	cin >> t;
	while(t--){
		memset(g, 0, sizeof g);//矩阵
		memset(r, 0, sizeof r);//每一行1的个数
		cin >> n >> m >> a >> b;
		if(n * a != m * b) cout << "NO" << endl;
		else{
			int j = 0;
			for(int i = 0; i < n; i++){
				for(; r[i] < a; j = (j + 1) % m){//按顺序放,循环构造 
					g[i][j] = 1;
					++r[i];
				}
			}
			cout << "YES" << endl;
			for(int i = 0; i < n; i++){
				for(int j = 0; j < m; j++){
					cout << g[i][j];
				}
				cout << endl;
			}			
		}
	}
H. Binary Median
  • 待补...

猜你喜欢

转载自www.cnblogs.com/honey-cat/p/12977174.html