A题:
找规律的题,如果n%4==0,那么就能被3整除。
#include <iostream>
#include <stdio.h>
using namespace std;
long long a[1000005];
int main()
{
int t,i,j;
cin >> t;
for(i=0;i<t;i++)
{
long long n;
cin >> n;
if(n%4==0)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}
B题:
单纯的输出
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int t,n,i,j,k;
cin >> t;
for(i=0;i<t;i++)
{
cin >> n;
for(j=1;j<=n;j++)
{
for(k=0;k<n-j;k++)
cout << " ";
for(k=0;k<2*j-1;k++)
cout << "*";
cout << endl;
}
}
return 0;
}
C题:
本题输入字符串要用能读空格的gets或者getline,并且是将单词进行翻转而不是字母,所以,解决方法是将读取字符,若遇到空格,则将前面的字符存入到一个数组中,以此类推
代码如下:
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
char c[1000];
char s[1000][1000];
int t,i,j;
cin >> t;
getchar();
for(i=0;i<t;i++)
{
int k=0,l=0;
gets(c);
for(j=0;c[j]!='\0';j++)
{
if(c[j]!=' ')
{
s[k][l]=c[j];
l++;
}
else
{
s[k][l]='\0';
k++;
l=0;
}
}
s[k][l]='\0';
for(j=k;j>0;j--)
cout << s[j] << " ";
cout << s[0] << endl;
}
return 0;
}
D题:
这道题属于dfs,首先先求所有木棒的和,在判断不能组成正n边形的情况为:和不能被4整除、最长的木棒比和/n大。处这两种情况外,剩下的情况放在dfs中处理。
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int maxn = 24;
int a[ maxn ];
int vis[ maxn ];
int n ,flag;
void dfs( int pos,int len,int LEN,int sum ) //
{
if( flag==1 )
return ;
if( sum==3 )
{
flag=1;
return ;
}
for( int i=pos; i<=n; i++ )
{
if( vis[ i ]==0 )
{
if( len+a[i]<LEN )
{
vis[ i ]=1;
dfs( i,len+a[i],LEN,sum );
vis[ i ]=0;
}
else if( len+a[i]==LEN )
{
vis[ i ]=1;
dfs( 1,0,LEN,sum+1 );
vis[ i ]=0;
}
}
}
return ;
}
int main()
{
int t,N;
scanf("%d",&t);
while( t-- )
{
int sum=0;
cin >> N;
scanf("%d",&n);
for( int i=1; i<=n; i++ )
{
scanf("%d",&a[ i ]);
sum+=a[ i ];
}
if( sum%N!=0 )
{
printf("No\n");
continue;
}
sort( a+1,a+1+n );
if( a[n]>( sum/N ) )
{
printf("No\n");
continue;
}
memset( vis,0,sizeof( vis ));
flag=-1;
dfs( 1,0,sum/N,0 );
if( flag!=-1 )
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
E题:
本题属于找零钱问题,首先找钱肯定先从面值最大的钱里面找,那么有两种情况,(1)M/100大于100元的张数,那么100元的回全部找出,那剩下M-100*张数,再以此类推50,20,10,5,1元的情况;(2)小于张数,那么只需付足够的钱即可。最后判断M是否为0.
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int mian[6]={100,50,20,10,5,1};
int num[6]={0};
int main()
{
int t,i,M,s;
cin >> t;
while(t--)
{
cin >> M;
for(i=0;i<6;i++)
{
cin >> num[i];
}
for(i=0;i<6;i++)
{
s=M/mian[i];
if(s>num[i])
{
M-=(num[i]*mian[i]);
}
else
M%=mian[i];
}
if(M==0)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
}
F题:
简单的字符串转化问题
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
char c[26];
int main()
{
c[0]='a';
for(int m=1;m<26;m++)
{
c[m]=c[m-1]+1;
}
int t,i,j;
int a[35];
string s;
cin >> t;
for(i=0;i<t;i++)
{
cin >> s;
int l=s.length();
for(j=0;j<l-1;j++)
{
a[j]=(s[j]-'0')*(s[j+1]-'0');
a[j]%=26;
cout << c[a[j]];
}
cout << endl;
}
return 0;
}
G题:
这道题是博弈,难点是寻找必败态,本题中必败态分为两种:(1)两堆的时候,只要棋子相同则为必败;(2)三堆的时候,1 1 1为必败,则由此可以推出1 2 3为必败,1 4 5为必败,2 4 6为必败,3 4 7为必败,所以只有先在2堆拿一个棋子必胜,
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int k,n;
while(scanf("%d%d",&k,&n)!=EOF)
{
if(k==0&&n==0)
break;
if(k==2)
{
if(n==1)
cout << "Dw is the winner!!!" << endl;
else
cout << "Daddy is the winner!!!" << endl;
}
else
cout << "Daddy is the winner!!!" << endl;
}
return 0;
}
H题:
简单的数学计算题,公式为:n*(n-1)/2-1.
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
cout<<n*(n-1)-1<<endl;
}
return 0;
}
I题
结构体排序
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
struct m
{
double y,s,w,li,wen,sum;
string name,ke;
};
int cmp(m N,m M)
{
return N.sum>M.sum;
}
int main()
{
m N[1005];
int n,i;
cin >> n;
for(i=0;i<n;i++)
{
cin >> N[i].name >> N[i].ke >> N[i].y >> N[i].s >> N[i].w >> N[i].li >> N[i].wen;
if(N[i].ke=="Science\0")
N[i].sum=N[i].y+N[i].s+N[i].w+N[i].li*0.7+N[i].wen*0.3;
else
N[i].sum=N[i].y+N[i].s+N[i].w+N[i].li*0.3+N[i].wen*0.7;
}
sort(N,N+n,cmp);
for(i=0;i<n;i++)
{
cout << N[i].name << " : " << N[i].sum << endl;
}
return 0;
}
J题:
本题是求相交区间的长度,将两个图形分别投影到x轴和y轴求出相交区间的长度为相交长方形的长和宽。
#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
using namespace std;
int max(int a,int b,int c,int d)
{
int t=0;
if(a>=t)
t=a;
if(b>=t)
t=b;
if(c>=t)
t=c;
if(d>=t)
t=d;
return t;
}
int min(int a,int b,int c,int d)
{
int t=10000;
if(a<=t)
t=a;
if(b<=t)
t=b;
if(c<=t)
t=c;
if(d<=t)
t=d;
return t;
}
int main()
{
int x1,y1,x2,y2,a1,a2,xx,yy;
while(scanf("%d%d%d",&x1,&y1,&a1)!=EOF)
{
cin >> x2 >> y2 >> a2;
int s1=0,s2=0,s3=0,w=0;
int l1=max(x1,x2,x1+a1,x2+a2);
int l2=min(x1,x2,x1+a1,x2+a2);
int w1=max(y1,y2,y1-a1,y2-a2);
int w2=min(y1,y2,y1-a1,y2-a2);
if(l1-l2>=a1+a2)
{xx=0;}
else
{xx=a1+a2-(l1-l2);}
if(w1-w2>=a1+a2)
{yy=0;}
else
{yy=a1+a2-(w1-w2);}
s2=xx*yy;
s1=a1*a1-s2;
s3=a2*a2-s2;
w=30*s1+50*s2+40*s3;
cout << w << endl;
}
return 0;
}
K
水题
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
printf(" A CCCCCCCC MM MM\n");
printf(" A A C M M M M\n");
printf(" A A C M M M M\n");
printf(" AAAAAAA C M M M M\n");
printf(" A A C M M M\n");
printf("A A CCCCCCCC M M\n");
return 0;
}
L题:
本题可以从捆成混合花束的数量进行讨论,混合花束的数量可能为0,1,2;分别计算出三种情况下的值,然后取最大值就可以了,,,
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int sum1,sum2,sum3;
int max(int a,int b,int c)
{
int t=0;
if(t<=a)
t=a;
if(t<=b)
t=b;
if(t<=c)
t=c;
return t;
}
int min(int a,int b,int c)
{
int t=10000000;
if(t>=a)
t=a;
if(t>=b)
t=b;
if(t>=c)
t=c;
return t;
}
int main()
{
int t,i;
int R,B,G;
cin >> t;
while(t--)
{
sum1=0,sum2=0,sum3=0;
cin >> R >> G >> B;
int k=min(R,G,B);
int m=R%3;
int n=G%3;
int p=B%3;
if(m<=k)
sum1=m+(R-m)/3+(G-m)/3+(B-m)/3;
if(n<=k)
sum2=n+(R-n)/3+(G-n)/3+(B-n)/3;
if(p<=k)
sum3=p+(R-p)/3+(G-p)/3+(B-p)/3;
int sum=max(sum1,sum2,sum3);
cout << sum << endl;
}
return 0;
}
M
等差数列c*c=d*b;则第四个数d=c*c/b;
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
int t,a,b,c;
cin >> t;
while(t--)
{
cin >> a >> b >> c;
cout << c*c/b << endl;
}
return 0;
}