集训队寒假集训第二场补题题解
Posted baccano-acmer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集训队寒假集训第二场补题题解相关的知识,希望对你有一定的参考价值。
补题什么的待填坑。。。
A - Generous Kefa (语法基础)
直接开桶看看有没有超过三个的,因为题目明确提出没有气球也是可以的
代码
#include <bits/stdc++.h>
using namespace std;
int bk[123213];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,k;
cin>>n>>k;
string a;
cin>>a;
for(int i=0;i<a.size();i++)
{
bk[a[i]]++;
if(bk[a[i]]>k)
return cout<<"NO",0;
}
cout<<"YES";
}
B - Godsend(思维)
如果存在一个奇数的话那么第一个就赢否则第二个赢
因为第一个先选如果有奇数且都是奇数那么第一个肯定赢
否则第一个肯定要把所有的偶数选上外加奇数这样凑成奇数
那么如果剩余奇数个奇数他可以全部选上外加偶数那么就是最初的第一种情况
如果剩余偶数个奇数那么选择剩余奇数-1个奇数加上全部偶数这样还是第一个赢
综上所述只要有奇数就是第一个赢
代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int t;
cin>>t;
if(t%2!=0)
return cout<<"First",0;
}
cout<<"Second";
}
F - New Year and Days (思维)
实际上月份的那个好说就是周的那个得看看首先得算一算
实际上就是用ceil(剩余的天数/第一个日期)
当然你也可以看看日历告诉你4有52个那么看一月第一个星期是5开头12月最后一个星期是星期六结尾那么5 6就是53 1 2 3 4 7就是52也可以
最不行的方法你也可以直接去数啊- -
代码
#include <bits/stdc++.h>
using namespace std;
int bk[123213];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
string a,b;
cin>>n>>a>>b;
if(b=="week")
{
if(n==5||n==6)
cout<<53;
else if(n>=1&&n<=4)
cout<<52;
else if(n==7)
cout<<52;
}
else if(b=="month")
{
if(n<=29)
cout<<12;
else if(n==30)
cout<<11;
else if(n==31)
cout<<7;
}
}
H - New Year and Old Property(位运算)
第二个数的二进制的长度肯定大于等于第一个数二进制的长度
所以我们用位运算去枚举这两个长度之间到底有多少个只包含0的二进制且这个二进制的十进制在这两个数的闭区间内
那么也就是ans=(1<<i)-1-(1<<j)
i in range(len1,len2+1)
j in range(0,i-1)
上面都是python的写法range是一个左闭右开区间
最后看ans在不在两个给定的数的闭区间内即可如果在那么答案+1,最后输出答案
代码
a,b=map(int,input().split())
c=bin(a)[2:]
d=bin(b)[2:]
t1=len(c)
t2=len(d)
ans=0
for i in range(t1,t2+1):
for j in range(0,i-1):
if ((1<<(i))-1-(1<<j)) in range(a,b+1):
ans+=1
print(ans)
以上是关于集训队寒假集训第二场补题题解的主要内容,如果未能解决你的问题,请参考以下文章