水了十道题,打算以这种方式进行,我的代码&其他人的代码方式呈现

超级玛丽问题

acm001.png

#include<stdio.h>
int main()
{
 printf("                ********\n");
 printf("               ************\n");
 printf("               ####....#.\n");
 printf("             #..###.....##....\n");
 printf("             ###.......######              ###            ###\n");
 printf("                ...........               #...#          #...#\n");
 printf("               ##*#######                 #.#.#          #.#.#\n");
 printf("            ####*******######             #.#.#          #.#.#\n");
 printf("           ...#***.****.*###....          #...#          #...#\n");
 printf("           ....**********##.....           ###            ###\n");
 printf("           ....****    *****....\n");
 printf("             ####        ####\n");
 printf("           ######        ######\n");
 printf("##############################################################\n");
 printf("#...#......#.##...#......#.##...#......#.##------------------#\n");
 printf("###########################################------------------#\n");
 printf("#..#....#....##..#....#....##..#....#....#####################\n");
 printf("##########################################    #----------#\n");
 printf("#.....#......##.....#......##.....#......#    #----------#\n");
 printf("##########################################    #----------#\n");
 printf("#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n");
 printf("##########################################    ############\n");
 return 0; 
} 

我的代码,最最简单的一道水题 不说了

A+B Problem

acm002.png
看题 还是水题,,有点不想写 但还是写上吧

#include <iostream>
#include <cstdio>

using namespace std;

int main() {
    int a,b;
    cin >> a >> b;
    cout << a+b;
    return 0;
}

这里的csdio就是c里面的<stdio.h> orz..

小玉买文具

acm003.png
这道题的思路刚开始是统一单位,再进行计算,因为钱财问题差多少钱人家都不卖你,所以我这里面直接取int类型 就是笔的个数,我的代码如下

#include<stdio.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    printf("%d",(10*a+b)/19);    

    return 0;

}

其他人的代码和我思路完全一样,所以不放了。

小鱼游泳

acm004.png
我的思路超级暴力,先全转化分钟数,然后除以60 因为类型原因 保留整数的小时,再将这个小时乘以60分钟,再拿分钟减 我的代码如下

#include<stdio.h>

    int main()
    {
        int a,b,c,d,e,f;
        scanf("%d %d %d %d",&a,&b,&c,&d);
        e=((c*60+d-(a*60+b)))/60;
        f=((c*60+d-(a*60+b)))-e*60;
        printf("%d %d",e,f);
        return 0;
    }

看了看其他人的代码

    #include <iostream>
    using namespace std;
    int main()
    {
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        int x=c-a,y=d-b;
        if(y<0){x--;y+=60;}
        cout<<x<<" "<<y;
        return 0;
    }
妙啊 直接拿分钟相减 如果小于0 小时进位,这个思路非常不错,非常值得学习

## 小玉家的电费 ##
acm005.png
分支结构,很容易理解和写 我就直接写下来了


    #include<stdio.h>
    int main()
    {
        int a;
        double b;
        scanf("%d",&a);
        if(a<=150)
        {
            b=a*0.4463;
        }
        if(a>150&&a<=400)
        {
            b=(a-150)*0.4663+150*0.4463;
        }
        if(a>400)
        {
            b=(a-400)*0.5663+250*0.4663+150*0.4463;
        }
        printf("%.1lf",b);
        return 0;
        
    
    
    
    }
看了看别人的代码,有一个数组的让我眼前一亮 有点意思

    #include <iostream>
    using namespace std;
    double cost[10005];//代表第i度电的花费
    int a;
    double b;
    int main()
    {
        int i;
        cin>>a;
        for(i=1;i<=150;i++)
           cost[i]=0.4463;
        for(i=151;i<=400;i++)
           cost[i]=0.4663;
        for(i=401;i<=10000;i++)
           cost[i]=0.5663;
        for(i=1;i<=a;i++)
           b+=cost[i];
        b=int((b*10)+0.5)/10.0;
        cout<<b<<endl;
        return 0;
    }
很容易理解看懂 我看完觉得思路很不错 就写下来了

不高兴的津津

acm006.png
看了眼题目,一开始没思路,后来发现是没看懂题目orz 一定要好好看题目,首先想到肯定要键入7天的数据 并且满足的条件是>8小时并且7天内是最高的 设a 和b 分别是在学校和在家的小时 每一次循环找出最大的小时赋给max 让他和天数比较,每一次循环都要用一个num表示天数 so 我的代码如下

#include<stdio.h>
int main()
{
    int a,b,num=0,max=0;
    for(int i=0;i<7;i++)
    {
        scanf("%d %d",&a,&b);
        if(a+b>max&&a+b>8)
        {
            num=i+1;
            max=a+b;
            
        }
    }
printf("%d",num);
return 0;

看到别人的代码

#include <iostream>
using namespace std;
int main()
{
    int t1,t2;
    int maxf=0,t=0;//最大量,最大的天数 
    int now=0;//记录现在是哪天 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cin>>t1>>t2;
    now++; 
    if(t1+t2>maxf) maxf=t1+t2,t=now; 
    cout<<t;
    return 0;
}

思路一样 他的好暴力啊,不断更新日期不断进行比较

津津的储蓄问题

acm007.png
我看到这道题想了蛮久的才有思路 我打算分两种钱 手里的和给妈妈的,最后将钱相加 逢100给妈妈 然后每个月单独算钱是否不够,不够输出月份的负数 直接return 0即可 我的代码如下

#include<stdio.h>
int main()
{
    int yusuan,s=0,m=0;
        for(int i=1;i<=12;i++)
        {
            scanf("%d",&yusuan);
            s=s+(300-yusuan);
            if(s<0)
            {
                printf("-%d",i );
                return 0;
            }
            else
            {
                m+=s/100;
                s%=100;
            }
            
        }

printf("%d",120*m+s);

    

    return 0;
}

翻了翻其他人的代码 我挺喜欢旗帜倒下这个的,给大家看一下

#include<iostream>
using namespace std;
int money,cost,mama,flag=1,monthofdeath;  //money代表在津津手里的钱,cost代表花费的钱,mama代表在妈妈手里的100元的张数,flag=1代表尚未透支,monthofdeath代表死亡月份 

    int main ()
    {
        for(int i=1;i<=12;i++)
        {
            money+=300;  //每个月津津手里的钱都会增加300 
            cin>>cost;     //输入这个月的花销 
            money-=cost;     // 津津手里的钱减去这个月的花销等于剩余的钱 
               if(money<0)     //若剩余的钱小于0, 
               {     
                  flag=0;      //旗帜倒下,即已经透支 
                  monthofdeath=i;    //输出死亡月份 
                  break;            //终止循环 
               }
            mama+=money/100;    //剩余的钱整除100即为在妈妈手里的100元的张数 
            money%=100;         //用100去模剩余的钱即为月底幸存的钱         
        }    
        if(flag==1)      //若旗帜未倒下,即坚持到年底还没有透支 
        {
            money+=mama*120;    //剩余的钱 
            cout<<money;
        }            
        else
        {
            cout<<-monthofdeath;
        }    
        return 0;
    }

说实话 和我的思路完全一样 只不过他这个旗帜倒下我很喜欢 我们ctfer都喜欢flag!

买铅笔

acm008.png
这道题很容易,分别算钱数然后比较即可,我的思路是数组存放,然后排序寻找 可惜的是总有wa,后来经过其他人提醒才知道自己的排序出了问题,修改之后的代码

#include<stdio.h>
int main()
{
    int m,n,s,cost[10],t;
    scanf("%d",&n);
    for(int i=0;i<3;i++)
    {
        scanf("%d %d",&m,&s);
        if(n%m==0)
        {
            cost[i]=(n/m)*s;
        }
        else
        {
            cost[i]=((n/m)+1)*s;
        }
        

        

    }
    for(int i=1;i>=0;i--)
    {
        if(cost[i]>cost[i+1])
            {
                t=cost[i];
                cost[i]=cost[i+1];
                cost[i+1]=t;
            }
    }
        
        printf("%d",cost[0]);
        return 0;
}

三连击

acm009.png
看了眼题目 一开始思路全无,后来得到提示 123456789这几个数字的乘积和他们的和是固定的,茅塞顿开,写下代码

#include<stdio.h>
int main()
{
    int a,b,c;
    for(a=123;a<=333;a++)
         {
                b=a*2;
                c=a*3;
           if((a/100)+(a/10%10)+(a%10)+(b/100)+(b/10%10)+(b%10)+(c/100)+(c/10%10)+(c%10)==1+2+3+4+5+6+7+8+9&&(a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==362880)
                    
                    
                    printf("%d %d %d\n",a,b,c);
           }
        
    return 0;
}

关键点在于1:2:3
其他师傅的思路大同小异

级数和

acm010.png
这种循环体还是蛮简单的 我的思路是sum作为和 判断条件是小于等于输入的k 然后自加一个变量i sum+=1.0/i来判断 加了几个i 这个"n"就是几 我的代码如下

#include<stdio.h>
int main()
{
    int i=0,k;
    scanf("%d",&k);
        for(double sum=0;sum<=k;i++,sum+=1.0/i);
            printf("%d",i);
}

看了其他师傅的递归做法

#include<cstdio>
using namespace std;
double search(double,double);
double n,t=1;
double print(double);
int main()
{
    cin>>n;
    search(n,0);//搜索模块。
}
double search(double x,double sum)//下面就是调用的深搜模块。
{
        sum=sum+1/t;
        t++;
        if(sum>n) print(t);//调到输出的子程序
        else return search(x,sum);//深搜
    }
double print(double q)
{
    cout<<q-1;
    return 0;
}

总结

练习 刷题 题目比较简单,加油