Codeforces Round #843 (Div. 2) A~E
A. Gardener and the Capybaras
这道题目就是想让我们输出三个字符串,然后又一个要求就是中间这个字符串具有最值(最大或最小)的字典序
这里需要注意一下,这个字符串里面只有 a , b , 那我们就先判断第一种情况最小的情况 :
for(int i = 1 ; i < s.size() - 1 ; i ++ ) { if(s[i] == 'a') { cout << s.substr(0 , i) << " " << s[i] << " " << s.substr(i + 1) << "\n"; // ababbab ... , a ,ababbbba ... 在这里 a 就是字典序最小 goto aim; } }
还有一个最大的情况 :
cout << s[0] << " " << s.substr(1 , s.size() - 2) << " " << s[s.size() - 1] << "\n";
所以和在一块写就可以写出这道题
ACcode
void solve() { ios; int t; cin >> t; aim : while(t -- ) { string s; cin >> s; for(int i = 1 ; i < s.size() - 1 ; i ++ ) { if(s[i] == 'a') { cout << s.substr(0 , i) << " " << s[i] << " " << s.substr(i + 1) << "\n"; goto aim; } } cout << s[0] << " " << s.substr(1 , s.size() - 2) << " " << s[s.size() - 1] << "\n"; } }
B. Gardener and the Array
这个题目是一道按位计算,但是我们可以通过理解题目获取关键信息,我们其实是要记录数字出现的次数,若数字出现次数为一,我们就可以知道结果等价为0
void solve() { int n;
cin >> n; map<int, int> cnt; // 记录每个位的出现次数 vector<int> v[n+1]; //记录每个数为1的位数 for(int i=1;i<=n;i++) { int k; cin >> k; for(int j=1;j<=k;j++) { int x; cin >> x; v[i].push_back(x); cnt[x]++; } } for(int i=1;i<=n;i++) { int flag = 1; for(auto it: v[i]) { if(cnt[it] == 1) // 如果仅出现一次的话,去除这个数之后,在这一位上就只能为0,不满足要求 { flag = 0; break; } } if(flag == 1) { cout << "Yes\n"; return; } } cout << "No\n"; }
C. Interesting Sequence
这个题目其实就是先把数字先化为二进制,然后找到最早1出现的位置然后进行一个标记,然后就可以进行计算了,若最后结果是小于0,我们就输出“-1” ,否则输出对应结果
void solve() { int t; cin >> t; while(t -- ) { int flag = 0; int n , m; cin >> n >> m; int k = n; while((n & k) != m) { k += (k & (-k)); if(k >= 0) { continue; } cout << "-1" << "\n"; flag = 1; break; } if(flag == 0) { cout << k << "\n"; } } }