Codeforces Global Round 16 简训
导语
第一次队内CF训练,主要是为了提高签到题和简单题的准确率
涉及的知识点
贪心,思维
题目
A Median Maximization
题目大意:给出两个数n,s,一个长度为n的序列,满足每个值为非负数,序列和为s,定义中位数为该序列升序排序后为第ceil(n/2)个数,求出满足条件的最大的中位数
思路:直接贪心,设置前ceil(n/2)-1个数为0,然后假设后n-ceil(n/2)+1的最小值最大能为多少,具体看代码
代码
#include <bits/stdc++.h>
using namespace std;
int n,s,t;
int main() {
scanf("%d",&t);
while(t--) {
scanf("%d%d",&n,&s);
int len=n-ceil((double)n/2)+1;
printf("%d\n",s/len);
}
return 0;
}
B MIN-MEX Cut
题目大意:略
思路:直接找有多少个被切割的0块即可,根据0块的个数判断即可,详见代码
代码
#include <bits/stdc++.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int n,t;
char s[121212];
int main() {
scanf("%d",&t);
while(t--) {
int zero=0,div=0;
scanf("%s",s);
getchar();
int len=strlen(s);
for(int i=0; i<len; i++)
if(s[i]=='0') {
if(div)
continue;
else {
div=1;
zero++;
}
} else
div=0;
if(zero>=2)
printf("2");
else if(zero==0)
printf("0");
else
printf("1");
putchar('\n');
}
return 0;
}
C MAX-MEX Cut
题目大意:略
思路:对上下不同的直接累和,对上下都为0或1的看下一位,看是否能合并,最后注意边界问题,函数judge在最后的return代表越界时候(i为n-1了,i+1为n了)返回的值,这个值不会被使用,但是需要加上以防越界产生错误
这波是队友心细如麻
代码
#include <bits/stdc++.h>
using namespace std;
int n,t;
char str1[121212],str2[121212];
int judge(int i) {
if(str1[i]!=str2[i])
return 2;
else if(str1[i]=='1'&&str2[i]=='1')
return 0;
else if(str1[i]=='0'&&str2[i]=='0')
return 1;
else
return 0;
}
void solve() {
int ans=0;
scanf("%d",&n);
scanf("%s%s",str1,str2);
for(int i=0; i<n; i++) {
if(judge(i)==2)
ans+=2;
else if(judge(i)==1) {
if(judge(i+1)==0) {
ans+=2;
i++;
} else
ans++;
} else if(judge(i)==0) {
if(judge(i+1)==1) {
ans+=2;
i++;
}
}
}
printf("%d\n",ans);
}
int main() {
scanf("%d",&t);
while(t--)
solve();
return 0;
}
参考文献
无