文章目录
A. Turtle and Good Strings
思路
签到题,判断第一个字符和最后一个字符是否相等即可
code
void solve(){
int n;cin >> n;
string s;cin >> s;
if(s[0]==s[s.size()-1]) cout << "no" << endl;
else cout << "yes" << endl;
return ;
}
B. Turtle and Piggy Are Playing a Game 2
思路
考点:贪心
根据最优策略,小乌龟每次选取的数都是序列中最小的数,小猪每次选取的数都是序列中最大的数
不难想到,经过若干次操作,最终的答案就是排完序后,序列的中位数
code
void solve(){
int n;cin >> n;
for(int i=1;i<=n;++i) cin >> a[i];
sort(a+1,a+1+n);
cout << a[n/2+1] << endl;
return ;
}
C. Turtle and Good Pairs
思路
考点:贪心
如果一对整数
(
i
,
j
)
(i,j)
(i,j) 是一对好数,那么
s
i
=
s
j
s_i=s_j
si=sj ,无论将这对整数放到什么位置都一定满足的
因此我们只需要考虑
(
i
,
j
)
(i,j)
(i,j) 是一对令人愉快的整数
拿样例2来说:edddf
ddd这三个字符无论放什么位置他们都是互为好对数,所以不用考虑他们的位置
我们只需要考虑字符e和字符f,显然根据令人愉快的整数整数的定义,(1,2) (1,3) (1,4)都不满足,只有(1,5)满足
如果我们将字符拆散,即改成defdd,那么(1,3)就可以满足了
简单来说,我们尽量让每个字符都不连在一起,这样好对数的数量就更多
code
const int N=27;
void solve(){
int a[N]={0};
int n;cin >> n;
string s;cin >> s;
for(auto i : s) a[i-'a']++;
while(1){
int f=0;
for(int i=0;i<26;++i){
if(a[i]){
cout << char(i+'a');
f=1;
a[i]--;
}
}
if(f==0) break;
}
cout << endl;
return ;
}
D1. Turtle and a MEX Problem (Easy Version)
思路
找规律的一道题,对于一个序列
a
a
a,我们先找出这个序列的mex,令找出的值为x
根据题目要求,我们可以进行任意次操作,每次操作都需要将x放入序列中
显然,我们找出这个序列的mex,然后将它加入序列在找新的mex,这个结果是最优的
在往后,我们缺少第一次的mex,所以我们不能继续执行操作,一个序列的操作数最多2次
找到这个规律题目就非常简单了,我们只需要将这n个序列执行2次操作,找出最大的x
- 对于小于等于x的数,我们都让它变为x
- 对于大于x的数,我们不需要做任何改变
接下来我们将这些数进行累加,运用数学的等差数列求和公式即可
code
void solve(){
int n,m;
cin >> n >> m;
int mx=-1;
for(int i=1;i<=n;++i){
int l;cin >> l;
set<int> s;
for(int j=1;j<=l;++j){
int x;cin >> x;
s.insert(x);
}
int temp=0,f=0;
for(int j=0;;++j){
if(s.find(j)==s.end()){
if(f==0) f=1;
else{
temp=j;
break;
}
}
}
mx=max(mx,temp);
}
if(m<=mx){
cout << (m+1)*mx << endl;
}
else{
cout << (mx+1)*mx+(m-mx)*(mx+1+m)/2 << endl;
}
return ;
}