2020/5/23习题训练二
A - Candies
题意:对于X+2X+4X+...+2n-1X=n, 保证至少有一个解,求一个整数X满足这个等式(k>1)
等比数列求和得X(2K-1)=n ,所以X=n/(2k-1)
让k从2开始依次增加直到找到符合条件的数输出

#include<iostream> #include<cmath> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; int main(){ ll t; cin>>t; while(t--){ ll n; cin>>n; for(ll k=2;;k++){ ll item=pow(2,k)-1; if(n%item==0){ cout<<n/item<<endl; break; } } } return 0; }
B - Balanced Array
题意:构建一个数组 1.前n/2个元素是偶数,2.后n/2个元素是奇数 3.前n/2个元素等于后n/2个元素
可以构造出时,输出YES和这样一个数组,反之输出NO ( 保证输入的n为偶数 )
分析知前n/2个元素的和为偶数,则后n/2个元素的和也应该为偶数,又因为后n/2个元素均为奇数,
所以n/2为偶数时可以构造出这样一个数组,对于1到n/2之间的元素从2,4,6……依次输出,和
为sum1,对于n/2+1到n-1之间的元素从1,3,5……输出,和为sum2,最有一个元素为sum1-sum2

#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; if((n/2)%2!=0){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; int sum1=0,sum2=0; for(int i=2;i<=n;i=i+2){ cout<<i<<" "; sum1+=i; } for(int i=2;i<=n-2;i=i+2){ cout<<i-1<<" "; sum2+=i-1; } cout<<sum1-sum2<<endl; } } return 0; }
C - Ichihime and Triangle
题意:就给四个数a,b,c,d, a ≤ b ≤ c ≤d 分成三段,
- a ≤ x ≤ b
- b ≤ y ≤c
- c ≤ z ≤d
每一段选一个数,使其构成一个三角形;求能构成三角形的一组数
根据两边之和大于第三边,可以找两条大边再找一条小边例如x=b,y=c,z=c

#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(){ int t; cin>>t; while(t--){ int a,b,c,d; cin>>a>>b>>c>>d; cout<<b<<" "<<c<<" "<<c<<endl; } return 0; }
D - Kana and Dragon Quest game
题意:打怪兽,怪兽血量为X,有两种攻击方法1.X=X/2+10 2.X=X-10
方法1可以使用n次,方法2可以使用m次,判断能否把怪兽杀死
但只有x>x/2+10(x>20时)可以使用方法一,先使用方法一直到不能再用
在使用m次方法二判断是否能杀死怪兽

#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main(){ int t,i,j; cin>>t; while(t--){ int x,m,n; cin>>x>>n>>m; if(x>20){ for(i=1;i<=n&&x>20;i++){ x=x/2+10; } } if(x<=m*10){ cout<<"YES"<<endl; }else{ cout<<"NO"<<endl; } } return 0; }
E - Candies and Two Sisters
题意:给两个姐妹分糖分别为a,b,且a+b=n,a<b,即a<n-a ( a<n/2);
输出有多少种分配方法;
当n为偶数的时候,a有n/2-1种取法
当n为奇数的时候,a有(int)n/2种取法

#include<iostream> #include<cstdio> #include<cmath> using namespace std; typedef long long ll; int main(){ int t; cin>>t; while(t--){ int n,end; cin>>n; if(n%2==1){ end=n/2; }else{ end=n/2-1; } cout<<end<<endl; } return 0; }
F - Construct the String
题意:构造长度为n的字符串,且长度为a的每个子字符串都有b个完全不同的字母。
构造长度为b的子字符串循环输出

#include<iostream> #include<cmath> #include<string> #include<cstdio> using namespace std; int main(){ int t; cin>>t; while(t--){ int n,a,b; char c; cin>>n>>a>>b; for(int i=0;i<n;i++){ c=i%b+'a'; cout<<c; } cout<<endl; } return 0; }