zoukankan      html  css  js  c++  java
  • Codeforces Round #712 (Div. 2) A~C

    Codeforces Round #712 (Div. 2)

    A. Déjà Vu

    暴力瞎搞即可,只有全a是不满足的,否则挑选a更多的一端加上a,当然也可以分别加a进行判断。

    #include <bits/stdc++.h>
    using namespace std;
    int main() {
    	int t;
    	cin >> t;
    	while(t--) {
    		string s;
    		cin >> s;
    		string s1 = s + "a", ss1 = s1;
    		reverse(ss1.begin(), ss1.end());
    		string s2 = "a" + s, ss2 = s2;
    		reverse(ss2.begin(), ss2.end());
    		if(s1 != ss1) {
    			cout << "YES" << endl;
    			cout << s1 << endl;
    		} else if(s2 != ss2) {
    			cout << "YES" << endl;
    			cout << s2 << endl;
    		} else cout << "NO" << endl;
    	}
    	return 0;
    }
    

    B. Flip the Bits

    注意到操作前面的不会影响到后面位置的可操作性,因此要从后往前判断。设置一个标记表示变了多少次,奇数次的话01互换,偶数次不变。从后往前遍历,如果a[i](此时是变换了奇数或者偶数次的a[i])和b[i]不一样且a的长为i的前缀里(也是变换了奇数或者偶数次的)01数量相等则进行变换,否则输出NO结束。统计前缀01数量其实可以维护两个变量,从后往前遍历的时候更新其值即可。

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    string a, b;
    int sum0[300005], sum1[300005];
    int main() {
    	int t;
    	cin >> t;
    	while(t--) {
    		sum0[0] = sum1[0] = 0;
    		cin >> n;
    		cin >> a;
    		cin >> b;
    		a = " " + a;
    		b = " " + b;
    		int aa[2];
    		aa[0] = aa[1] = 0;
    		for(int i = 1; i <= n; i++) {
    			if(a[i] == '0') aa[0]++;
    			else aa[1]++;
    			if(b[i] == '0') {
    				sum0[i] = sum0[i - 1] + 1;
    				sum1[i] = sum1[i - 1];
    			} else {
    				sum0[i] = sum0[i - 1] + 1;
    				sum1[i] = sum1[i - 1] + 1;
    			}
    		}
    		//操作前面的不会影响到后面位置的可操作性
    		//因此要从后往前判断
    		bool flag = 1;
    		int round = 0;
    		for(int i = n; i >= 1; i--) {
    			if(round & 1) {//先根据round判断当前的1是1还是0
    				if(a[i] == '0') a[i] = '1';
    				else a[i] = '0';
    			}
    			if(a[i] == b[i]) {
    				if(round & 1) {
    					if(a[i] == '0') aa[1]--;//更新要维护的变量
    					else aa[0]--;
    				} else {
    					if(a[i] == '0') aa[0]--;
    					else aa[1]--;
    				}
    				continue;
    			}
    			else {
    				if(round & 1) {
    					if(aa[0] == aa[1]) {
    						if(b[i] == '0') {
    							aa[0]--;
    						} else {
    							aa[1]--;
    						}
    					} else {
    						flag= 0;
    						break;
    					}
    				} else {
    					if(aa[0] == aa[1]) {
    						if(b[i] == '0') {
    							aa[1]--;
    						} else {
    							aa[0]--;
    						}
    					} else {
    						flag= 0;
    						break;
    					}
    				}
    				round++;
    			}
    		}
    		if(flag) cout << "YES" << endl;
    		else cout << "NO" << endl;
    	}
    	return 0;
    }
    

    C. Balance the Bits

    首先注意到头尾有0是不行的,因为a和b的头尾都得是(......)这样。其次n为奇数是不行的,并且1的数量为奇数是不行的。

    然后就是构造了,官方给的构造方法是为1的位置前一半是(,后一半是);为0的位置交替着填(b和a要相反)。

    暂时没想出来这么构造的道理...

    #include <bits/stdc++.h>
    using namespace std;
    int n;
    string s;
    bool valid(vector<char> v) {
    	int cnt = 0;
    	for(int i = 0; i < v.size(); i++) {
    		if(v[i] == '(') cnt++;
    		else {
    			if(cnt) cnt--;
    			else return 0;
    		}
    	}
    	return 1;
    }
    int main() {
    	int t;
    	cin >> t;
    	while(t--) {
    		cin >> n;
    		cin >> s;
    		int cnt = 0;
    		for(int i = 0; i < n; i++) if(s[i] == '1') cnt++;
    		if(s[0] == '0' || s[s.size() - 1] == '0' || n & 1 || cnt & 1) {
    			cout << "NO" << endl;
    			continue;
    		}
    		//接下来随便构造第一个肯定能构造出来
    		vector<char> v1, v2;
    		int cnt1 = 0, cnt2 = 0;
    		//cout << cnt / 2 << endl;
    		for(int i = 0; i < n; i++) {
    			if(s[i] == '1') {
    				cnt1++;
    				if(cnt1 <= cnt / 2) {
    					v1.push_back('(');
    					v2.push_back('(');
    				} else {
    					v1.push_back(')');
    					v2.push_back(')');
    				}
    			} else {
    				if(cnt2 & 1) {
    					v1.push_back('(');
    					v2.push_back(')');
    				} else {
    					v1.push_back(')');
    					v2.push_back('(');
    				}
    				cnt2++;
    			}
    		}
    		cout << "YES" << endl;
    		for(int i = 0; i < v1.size(); i++) cout << v1[i];
    		cout << endl;
    		for(int i = 0; i < v2.size(); i++) cout << v2[i];
    		cout << endl;
    		
    	}
    	return 0;
    //110011
    //()()()
    }
    
  • 相关阅读:
    Android关机流程源码分析
    开关机画面
    android camera
    深入分析AIDL原理
    VMware 虚拟机里连不上网的三种解决方案
    查看Linux中自带的jdk ,设置JAVA_HOME
    Hadoop三种模式安装教程(详解)
    Java ArrayList遍历删除问题
    idea git的使用(四)git建立分支与合并分支
    SpringBoot非官方教程 | 终章:文章汇总
  • 原文地址:https://www.cnblogs.com/lipoicyclic/p/14624667.html
Copyright © 2011-2022 走看看