习题训练计划 2020 05 22

A题:

分析等式,设等是左边x的系数为p,则p*x=n,由于第一项的系数一定一定为1,而后面的系数一定是2^i,偶数,故p一定为奇数,于是我就把n从3开始除以奇数,如果能整除,n/p就是结果,然后WA了。

其实p应该=2^0+2^1+2^2+…+2^I,把这些数写出来不难发现他们之间的规律,后一个数=前一个数*2+1,代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int n,i,j,k,m,t;

    cin>>t;

    while(t--)

    {

        j=3;

        cin>>n;

       while(n%j!=0)

       {

           j=1+2*j;

       }

       cout<<n/j<<endl;

    }

    return 0;

}

大水题,错误原因是分析的不彻底。

B题:

感觉比A难一点,也挺水的。

首先要保证n/2为偶数。

然后根据样例,先输出从2开始的偶数,共n/2个,然后输出从1开始的奇数,共计n/2-1个,最后输出偶数部分的和减去已经输出的奇数部分的和,代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int t,n,i,j,k;

    cin>>t;

    while(t--)

    {

        cin>>n;

        k=n/2;

        if(k&1)

        {

            cout<<"NO"<<endl;

            continue;

        }

        else

        {

            cout<<"YES"<<endl;

            int m=2;

            int sum=0;

            for(i=0;i<k;i++)

            {

                cout<<m<<' ';

                sum+=m;

                m+=2;

            }

            m=1;

            for(i=0;i<k-1;i++)

            {

                cout<<m<<' ';

                sum-=m;

                m+=2;

            }

            cout<<sum<<endl;

        }

    }

    return 0;

}

C题:

x、y、z要满足三角形任意两边之和大于第三第三边,及=即较小的两条边的和大于最大的边,即x+y>z,题目保重答案一定存在,所以只需要让x和y取最大值,z取最小值即可,代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int a,b,c,d,x,y,z;

    int t;

    cin>>t;

    while(t--)

    {

        cin>>a>>b>>c>>d;

        x=b;

        y=c;

        z=c;

        cout<<x<<' '<<y<<' '<<z<<' ';

    }

    return 0;

}

D题:

开始的思路是对两种方法进行比较,发现如果h>40就用第一种方法,h<=40用第二种方法,后来发现这样做样例1的最后一个点过不了。原因是理解错题意了。

正确思路是先进行第一种方法,直到使用完或者使用后h的值不再减少,然后再用第二种方法,最后判断h的值是正还是负,代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int t,n,m,i,j,k,l,v,x;

    cin>>t;

    int h;

    while(t--)

    {

        cin>>h>>n>>m;

        int flag=1;

        if(h<=m*10)

        {

            cout<<"YES"<<endl;

            continue;

        }

       while(n>0)

       {

           if(h/2+10<h)

           {

               h=h/2+10;

               n--;

           }

           else

           {

               break;

           }

       }

       while(m>0)

       {

           h-=10;

           m--;

       }

       if(h<=0)

       {

           cout<<"YES"<<endl;

       }

       else

       {

           cout<<"NO"<<endl;

       }

    }

    return 0;

}

E题:

水题。找规律,如果n是偶数就输出n/2-1;如果是奇数就输出n/2,代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int t,i,j,k,n,m;

    cin>>t;

    while(t--)

    {

        cin>>n;

        if(n&1)

        {

            cout<<n/2<<endl;

        }

        else

        {

            cout<<n/2-1<<endl;

        }

    }

    return 0;

}

F题:

思路很简单,循环输出从‘a’开始的字母,循环b次后再从’a’开始,直到输出n次,WA了一次是忘了换行。代码如下:

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()

{

    int t,n,m,i,j,k,a,b;

    cin>>t;

    char re='a';

    while(t--)

    {

        cin>>n>>a>>b;

        k=0;

        m=0;

        while(1)

        {

            for(i=0;i<b;i++)

            {

                printf("%c",re+i);

                k++;

                if(k==n)

                {

                    m=1;

                    break;

                }

            }

            if(m==1)

            {

                break;

            }

        }

        cout<<endl;

    }

    return 0;

}

原文地址:https://www.cnblogs.com/chengxvzhishen/p/12950355.html