2020-05-22 — 习题训练二
A - Candies
题意:求出x,x满足 x+2x+4x+⋯+2^(k−1)x=n
思路:提取x,后面构成等比数列,求和,然后暴力求解
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long ll pai(int a,int b){ ll ans=1; while(b){ if(b&1)ans*=a; a=a*a; b/=2; } return ans; } int main() { int t; cin>>t; while(t--){ ll n; cin>>n; for(int i=2;i<=n;i++){ ll q=pai(2,i)-1; if(n%q==0){ ll w=n/q; cout<<w<<endl; break; } } } }
B - Balanced Array
题意:给你一个偶数n,前n/2个数全是偶数,后n/2个数全是奇数,且前后二者之和相同,有YES,并输出,无NO。
思路:我发现,对于偶数和奇数,当二者有共同基值时,和若相等,最后一个一定为奇数,举个例子:2,4,6,8 与1 ,3,5,11,分别为(2*1,2*1-1),(2*2,2*2-1)……
而,前面所有偶数之和,减前三奇数之和,结果为11.
代码
#include<bits/stdc++.h> using namespace std; #define ll long long int main() { int t; cin>>t; while(t--){ ll sum=0; int n; cin>>n; if(n%4!=0||n==2){ cout<<"NO"<<endl; continue; } else{ cout<<"YES"<<endl; n=n/2; for(int i=1;i<=n;i++){ ll p=2*i; cout<<p<<" "; sum+=p;} for(int i=1;i<=n-1;i++){ ll q=2*i-1; cout<<q<<" "; sum-=q; } cout<<sum<<endl; } } }
C - Ichihime and Triangle
题意:给你a,b,c,d,找出x,y,z满足以下条件- a≤x≤b
- b≤y≤c
- c≤z≤d
使之能构成三角形
思路:我本来是暴力循环,超时了,,看了别人的思路,要满足两边之和大于第三边,只需有两个便相同,另一边比这两边小即可。
代码
#include<bits/stdc++.h> using namespace std; #define ll long long int main() { int t; cin>>t; while(t--){ ll a,b,c,d,m=1; cin>>a>>b>>c>>d; cout<<a<<" "<<c<<" "<<c<<endl; } }
D - Kana and Dragon Quest game
题意:
对于这道题,我们可以简化为:
kana要打败恶龙,恶龙有h点血。
Kana有两种法术:
- V法术——使龙的血量变成[h2]+10([ ]代表向上取整)。
- L法术——使龙的血量变成h−10。
给你龙的血量和使用V法术和L法术的最大次数,问可爱的kana能否杀死恶龙。
思路:我本来的思路是错的,看了别人的
使用尽可能多的V法术,但是不至于让恶龙回血。比如这个:
恶龙10点血。代入[h2]+10中得龙的血量变成15.
这是绝对不行的。
最后使用完L法术,看能不能把龙打死,如果能,输出“YES”;如果不能,输出“NO”
代码
#include<bits/stdc++.h> using namespace std; #define ll long long int main() { int t; cin>>t; while(t--){ int x,m,n; cin>>x>>n>>m; while(n!=0&&(ceil(x/2)+10<x)){ x=ceil(x/2)+10; n--; } if(m*10-x<0) cout<<"NO"<<endl; else cout<<"Yes"<<endl; } }
E - Candies and Two Sisters
题意:A和B两人分n个糖,每人最少一个,且A分得的数量要大于B,
思路:(奇数+1)/2-1或偶数/2-1
代码
#include<bits/stdc++.h> using namespace std; #define ll long long int main() { int t; cin>>t; while(t--){ ll n,sum=0; cin>>n; if(n%2==0){ sum=n/2-1; cout<<sum<<endl; } else{ sum=(n+1)/2-1; cout<<sum<<endl; } } }
F - Construct the String
说实话,,这是最难的,我认为,我不会,嗯
题意:构造一个长度为n的字符串,要求任意长度为a的字符字串有且仅有b个字母不同。
思路:(刚开始被忽悠了,其实这道题跟a一根毛关系都没有)只需要将b个不同的字符循环,构造一个长度为n的字符,那就一定满足每a个字符有b个字符不同(因为b个字符都有b个字符不同了,而且字符不同的个数为b)
#include <bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) { int n, a, b; cin>>n>>a>>b; for(int i=1;i<=n;i++){ printf("%c", i % b + 'a'); } cout<<endl; } return 0; }

浙公网安备 33010602011771号