习题训练计划 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;
}