寒训记录2 2021-1-29
继续记录不会写的/学到新东西的题
题目链接
vj简单暴力专题
BowWow and the Timetable
cf 1204A
转化二进制的做法,会tle,这个题是直接用二进制计算。
因为111111<1000000
因为发车时间是4^n(n为整数),转化为二进制就是
1,100,10000,1000000…
把二进制中除了第一位还有位数为1的直接进位
最后通过比较二进制位数与转化成了二进制的发车时间的位数
char a[107];
int main()
{
scanf("%s",a);
int n=(int)strlen(a);
int cnt1=0;
for(int i=0;i<n;i++){
if(a[i]=='1'){
cnt1++;
}
if(cnt1==2){
break;
}
}//判断是否要进一位
int dig=n;
if(cnt1<2){
dig--;
}
int ans;
if(dig%2==0){
ans=dig/2;
}
else{
ans=dig/2+1;
}
cout<<ans<<endl;
}
——————————
——————————
Zero Array
cf 1201B
基本题意:给出一个数组,每次取不同的两个元素各自-1,问该数组通过上述操作可否全部减为0;
举几个帮助我理解思路的样例
2
2 1e9
这组数据总和为偶数,但是显然答案为NO,因为1e9>1
5
2 2 2 2 2
YES
3
8 14 16
YES
首先,当数列和为奇数时,显然为NO
那么只考虑数列和为偶数的情况:
分析问题,要尽量先让最大的数字减为0,之后再考虑剩下的数字。
把每个数字具象化,想象成一堆球。每次减一就是拿走一个球。
每一次都拿一个来自最大值的球,以及剩余的随机一个;当最大的一堆球被取完的时候,相当于整个数列的sum减少了2*max,依旧为偶数;而通过特定取法,可以让剩下的偶数个球分布在合理的位置让其全部被取完。
所以,最终只要sum-max>=max,就可以输出YES