A.Paper Watering
思路:题目说有平方和开方两种操作,如果这个数是平方数,那么它开方之后就只能开方,如果平方的话就重复了,反之就有开方和平方两种操作。
代码如下
//A
#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int n,sum=0,k;
signed main()
{
cin>>n>>k;
if(k==0||n==1)
{
cout<<1<<endl;
return 0;
}
sum+=k;
while(k--)
{
int t=sqrt(n);
if(t==1)
{
sum++;
break;
}
sum++;
if(t*t!=n)
{
sum+=k;
}
n=t;
}
cout<<sum+1<<endl;
return 0;
}
B.nIM gAME
思路:这个题是个博弈题,我们可以发现想让brz赢就要让他取石子,1,2,3
都是偶数,因为这个题要求异域和,但是两人都足够聪明所以brz不可能赢
代码如下
//D
#include<iostream>
#include<algorithm>
#include<cmath>
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
int n,t;
signed main()
{
cin>>t;
while(t--)
{
cin>>n;
cout<<"lose"<<endl;
}
return 0;
}
E.Checksum
思路:因为k的范围就20所以就可以暴力枚举k有几个1,然后把A中1的个数加入,再转成二进制,看d与b是否相等
代码如下
#include <bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
const int N = 1e5+5;
int a[N],b[N];
void solve ()
{
string ans="99999999999999";//定义一个很大的string,用于判断
int n,k;cin>>n>>k;
string s;cin>>s;int cnt=0;
for (int i=0;i<s.size();i++)
{
if (s[i]=='1') cnt++;
}
for (int i=0;i<=k;i++)
{
string t;
int now=cnt+i;
int sss=0;
while (now&&sss<k)//转化成二进制
{
t+=(now%2)+'0';
sss++;
now>>=1;
}
for (int i=t.size();i<k;i++)
t+="0";//如果长度不够就补0
reverse(t.begin(),t.end());//反转过来
int pos=count(t.begin(),t.end(),'1');
if (pos==i)
{
ans=min(ans,t);
}
}
if (ans=="99999999999999") cout<<"None"<<'\n';
else cout<<ans<<'\n';
}
signed main ()
{
IOS;
int T =1;
cin>>T;
while(T--) solve ();
return 0;
}