• 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 '
    '
    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
    • 待补...
  • 相关阅读:
    mac下crontab定时任务使用
    javascript入门之算术乘法表
    原型模型
    Servlet开发
    工厂模式
    简单工厂模式
    Java设计模式之瞎BB的官话
    JavaBean技术
    软件设计模式之单例模式
    JSP页面请求与响应以及保存页面状态
  • 原文地址:https://www.cnblogs.com/honey-cat/p/12977174.html
Copyright © 2020-2023  润新知