2020-05-22 — 习题训练二

A - Candies 

题意:求出x,x满足 x+2x+4x++2^(k1)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;
        }
       }
    }
}
View Code

 

B - Balanced Array

题意:给你一个偶数n,前n/2个数全是偶数,后n/2个数全是奇数,且前后二者之和相同,有YES,并输出,无NO。

思路:我发现,对于偶数和奇数,当二者有共同基值时,和若相等,最后一个一定为奇数,举个例子:246,8 与135,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;
    }
  }
}
View Code

C - Ichihime and Triangle

 题意:给你a,b,c,d,找出x,y,z满足以下条件
  • axb
  • byc
  • czd

 使之能构成三角形

 思路:我本来是暴力循环,超时了,,看了别人的思路,要满足两边之和大于第三边,只需有两个便相同,另一边比这两边小即可。

代码

#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;
    }
}
View Code

D - Kana and Dragon Quest game

题意:

对于这道题,我们可以简化为:

kana要打败恶龙,恶龙有h点血。

Kana有两种法术:

  1. V法术——使龙的血量变成[h2]+10([ ]代表向上取整)。
  2. L法术——使龙的血量变成h10

给你龙的血量和使用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;
    }
}
View Code

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;
     }
    }
}
View Code

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;
}
View Code

 

posted @ 2020-05-25 19:01  CHUNIN  阅读(108)  评论(0)    收藏  举报