寒假集训第一周习题题解(第一弹)
ACM基础+时间复杂度+思维+模拟
D-回文数猜想
#include<stdio.h>
/*先写一个函数,把数字的每一位逆向转换到一个数组中,
再将这个数组转换成一个数字,并返回这个数字。*/
int change(int n)
{
int a[20];
int k=0;
while(n!=0)
{
k++;
a[k]=n%10;
n/=10;
}
int res=0;
for(int i=1;i<=k;i++)
{
res*=10;
res+=a[i];
}
return res;
}
int main()
{
int n,i,cnt,k;
int result[100];
while(scanf("%d",&n)!=EOF)
{
k=0;
cnt=0;
result[0]=n;
while(n!=change(n))//如果不是回文数,就将这个数和它的倒序数相加
{
n=n+change(n);
result[++cnt]=n;
k++;
}
printf("%d\n",k);
for(i=0;i<cnt;i++)
printf("%d--->",result[i]);
printf("%d\n",result[cnt]);
}
return 0;
}
心得体会:
第一次提交的时候,出现了presentation error,原因是在输出每次结果的后面没有一个换行。(哭了
F-买鸡问题
#include<stdio.h>
int main(){
int n;
int a=0;
scanf("%d",&n);
for(int i=0;i<=200;i++){
for(int j=0;j<=200;j++){
for(int t=0;t<=200;t++){
if(i*5+j*3+t==n&&i+j+3*t==n){
printf("%d %d %d\n",i,j,3*t);
a=1;
}
}
}
}
if(a==0){
printf("No Answer.\n");
}
return 0;
}
心得体会:
本题可以使用枚举的暴力方法求解,刚上手时整体思路是对的,但是在“无解”输出“No answer”的情况下出了问题,我一开始把输出“No answer”放在了循环里和输出三个整数互为一个if-else,这就导致了输出多次“No answer”。
所以,增加了一个类似开关的装置int a=0,当有解的情况下将a赋值为1,再在总循环后加判断是否有解。
H-最小新整数
#include<stdio.h>
#include<string.h>
struct node{
char s[50];
int len;
int k;
}z[100000];
int main(){
int t,i,len,j,x;
scanf("%d",&t);
for(i=0;i<t;i++){
scanf("%s %d",&z[i].s,&z[i].k);
z[i].len=strlen(z[i].s);
}
for(i=0;i<t;i++){
for(j=0;j<z[i].len-1;j++){
if(z[i].s[j]-'0'>z[i].s[j+1]-'0'){
z[i].k--;
for(x=j;x<z[i].len-1;x++){
z[i].s[x]=z[i].s[x+1];
}
z[i].len--;
j=-1;
}
if(z[i].k==0){
break;
}
}
}
for(i=0;i<t;i++){
for(j=0;j<z[i].len-z[i].k;j++){
printf("%c",z[i].s[j]);
}
printf("\n");
}
}
I-赶时间
#include<stdio.h>
int main(){
int h1,m1,s1,h2,m2,s2,a,b,c;
scanf("%d:%d:%d",&h2,&m2,&s2);
scanf("%d:%d:%d",&h1,&m1,&s1);
int x=h2*60*60+m2*60+s2;
int y=h1*60*60+m1*60+s1;
printf("%d",x-y);
return 0;
}
心得体会:
其实只要把两次的时间都换算成秒就行了。。。
J-暖气坏了
#include<stdio.h>
int main(){
int n,m,a[10000],k=0;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n-1;i++){
if((a[i+1]-a[i])<m){
k=a[i+1]-a[i]+k;
}
else{
k+=m;
}
}
printf("%d",k+m );
return 0;
}
K-完美立方
#include<stdio.h>
int vol(int a){
int vol=a*a*a;
return vol;
}
int main(){
int n;
scanf("%d",&n);
int a,b,c,d;
for(a=2;a<=n;a++){
for(b=2;b<a;b++){
for(c=b;c<a;c++){
for(d=c;d<a;d++){
if(vol(a)==vol(b)+vol(c)+vol(d)){
printf("Cube = %d, Triple = (%d,%d,%d)\n",a,b,c,d);
}
}
}
}
}
return 0;
}
M-母牛的故事
#include<stdio.h>
int main(){
int n;
scanf("%d",&n);
int a[55]={0,1,2,3,4},i;
for(i=5;i<=n;i++){
a[i]=a[i-1]+a[i-3];
}
printf("%d",a[n]);
return 0;
}
心得体会:
找规律就行。
可以先写出前几年的年份及对应的母牛数量,找到规律是:前四年的年份等于母牛数量,之后为本年数量=第前一年+第前三年
O-统计元音
#include<stdio.h>
#include<string.h>
int main(){
int n;
scanf("%d",&n);
getchar();//吸收一个换行'\n'
char s[100];
int a,e,i,o,u,m,j;
a=0,e=0,i=0,o=0,u=0;
for(m=0;m<n;m++){
gets(s);
;
// printf("%d\n",strlen(num[i].s));
for(j=0;j<strlen(s);j++){
if(s[j]==10)
break;
switch(s[j]){
case 'a' : a++;continue;
case 'e' : e++;continue;
case 'i' : i++;continue;
case 'o' : o++;continue;
case 'u' : u++;continue;
default : continue;
}
}
//printf("%d",j);
printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",a,e,i,o,u);
//输出完本次的之后,清零
a=0,e=0,i=0,o=0,u=0;
//注意:最后一次输出时后面没有空行
if(m!=n-1){
printf("\n");
}
}
return 0;
}
P-求数列的和
#include<stdio.h>
#include<math.h>
int main()
{
int m;
double sum,n;
while(scanf("%lf%d",&n,&m)!=EOF&&n<10000&&m<1000)
{
sum=n;//数列第一项也要加上
for(int i=1;i<=(m-1);i++)
{
n=sqrt(n);
sum+=n;
}
printf("%.2lf\n",sum);
}
return 0;
}
Q-数字游戏
#include<stdio.h>
int main()
{
char s[10];
scanf("%s", s);
int sum=0,a=0;
for(int i=0;i<9;i++){
if(s[i]=='1'){
sum++;
a=1;
}
else{
continue;
}
}
if(a==0){
printf("0");
}
else{
printf("%d",sum);
}
return 0;
}