Codeforces Round #760
比赛链接
Codeforces Round #760 (Div. 3)
A. Polycarp and Sums of Subsequences
题意
有一个由3个正整数组成的数组a。他写出这个数组中所有非空子序列的和,按非降序排序,得到一个包含7个整数的数组b。
即给定一个有7个元素的集合B,问是否存在一个三个数的集合A { a , b , c } {\{a,b,c\}} {
a,b,c},满足 { a , b , c , a + b , a + c , b + c , a + b + c } {\{a,b,c,a+b,a+c,b+c,a+b+c\}} {
a,b,c,a+b,a+c,b+c,a+b+c}等于集合B。
思路
首先得确定集合A中 a , b , c {a,b,c} a,b,c的值。假定 a < b < c a<b<c a<b<c,将集合B排好序后,则集合B中前两个数一定是 a , b a,b a,b, c c c存在于B中第三、四个数。做两次验证即可。
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[10];
int main(){
int T; cin>>T;
while(T--){
for(int i=0; i<7; i++) cin>>a[i];
sort(a, a+7);
cout<<a[0]<<" "<<a[1]<<" ";
if(a[0] + a[1] == a[2]) cout<<a[3];
else cout<<a[2];
puts("");
}
}
B. Missing Bigram
题意
Polycarp推出了一款新游戏供您玩。他称之为“丢失的二元图”。
一个单词的双字母表是其中两个相邻字母的序列。
例如,单词“abbaaba”包含双字母“ab”、“bb”、“ba”、“aa”、“ab”和“ba”。
游戏如下。首先,Polycarp提出了一个单词,仅由小写字母“a”和“b”组成。然后,他在白板上按单词出现的顺序写下所有的大字。之后,他从白板上擦去其中一个。
最后,Polycarp邀请您猜测他想出的单词是什么。
你的目标是找到任何一个单词,这样就可以写下它的所有双字图并删除其中一个,这样产生的双字图序列就和Polycarp最后的一个一样。
测试是以答案存在的方式生成的。如果有多个答案,您可以打印其中任何一个。
即给出 n − 2 n-2 n−2个相邻字符串,构造长度为 n n n的字符串,这个字符串只包含’a’,‘b’。
思路
对于第i个相邻字符串,如果第i-1的尾与第i个的头的字符相同,那只添加第i个的尾字符到目标字符串。将多的位置全部补’a’。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int T; cin>>T;
while(T--){
int n; cin>>n;
string ans = "";
for(int i=1; i<=n-2; i++){
string s; cin>>s;
if(ans[ans.size()-1] == s[0]) ans += s[1];
else ans += s;
}
for(int i=1; i<=n-ans.size(); i++) ans += 'a';
cout<<ans<<endl;
}
}
C. Paint the Array
题意
您将得到一个由n个正整数组成的数组a。您必须选择一个正整数d并将所有元素绘制为两种颜色。所有可被d整除的元素将被涂成红色,所有其他元素将被涂成蓝色。
如果数组中没有具有相同颜色的相邻元素对,则称为“美丽”。你的任务是找到任何能产生美丽色彩的d值,或者报告这是不可能的。
思路
想让数组没有相同颜色的相邻元素,只有可能红色的为奇数下标,蓝色的为偶数下标、或者红色的为偶数下标,蓝色的为奇数下标。
先取奇数下标区域的最大公约数t,看偶数下标有没有元素能整除他。偶数下标区域同理。
AC代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[105];
int n;
ll gcd(ll a, ll b){
return b?gcd(b, a%b):a;
}
ll solve(){
ll t = a[1];
for(int i=3; i<=n; i+=2) t =