【洛谷新手村解题报告一 前9题】C++语言,思路和WA反思


给出洛谷的链接: 洛谷链接
我会给出每题的自我难度评分和推荐刷值,看看就好
从1-1关卡开始!

洛谷的第一个任务

第一题 : 输出字符画 [0/1] 0表示难度、1表示推荐刷值

这个直接printf(“balabala\n”); 或者 cout << “balabala” << endl; 就好啦
给小白训练一下怎么输出和换行

第二题 : 标准A+B[0/1]

题意:输入两个int类变量,输出他们的和
熟悉一下自定义变量和变量输入

int a,b;
cin >> a >> b;
cout << a+b;

第三题 : 小玉买文具[1/1]

题意:a 元 b 角最多能买多少的1元9角的笔
a<=10000,b<=9
思路:化成a10+b (单位 角),(a10+b)/19即答案

tips: / 是整除符号,前后都是int类型的变量的话,会返回int值(整除)
比如: int/int = int ; int/double=double ; double/double=double ;
cout << 1.00 或者 cout << (double)1.00 都会输出1
所以如果要实现控制小数n位数输出 使用 cout << fixed << setprecision(n) << num;

第四题 : 小鱼的游泳时间[1/1]

题意:小鱼从a时b分一直游泳到当天的c时d分 共有游了多少时间?
思路:计算时差 c-a ,再计算分差 d-b
如果分差<0 那么借一个小时,时差-1 分差+60
如果分差>=60 那么还一个小时,时差+1 分差-60

一个很基础基础的模拟题了吧

顺序与分支

第一题 : 小玉家电费 [1/1]

题意:一个分段函数,给x求y

月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行

思路:
判断x在150以下/150-400/400以上 真的麻烦,用min()函数可以稍微舒服点

int aa;double ans=0;
    cin >> aa;
    ans=ans+min(aa,150)*1.0*0.4463;
    if(aa>150){ans=ans+(min(aa,400)-150)*1.0*0.4663;}
    if(aa>400){ans=ans+(aa-400)*1.0*0.5663;}
    cout << fixed << setprecision(1) << ans;

第二题 : 不高兴的津津[1/1]

津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

思路:开始设MA=8
每天上课的时间和ti,如果超过MA ,则令MA=ti ,ID=i

int a,b,ans=8,id=0;
    for(int i=0;i<7;++i){
        cin >> a >> b;
        if(a+b>ans){ans=max(ans,a+b);id=i+1;}
    }
    cout << id;

第三题 : 津津的储蓄计划[2/2]

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下33元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

一个稍微复杂一点的模拟题
每个月先获得300元->减去开销->判断是否够用->存钱->下个月

bool ok=1;
   int now=0,ct=0,cun=0,ans=0;
   for(int i=1;i<=12;++i){
       now=now+300;
       cin >> ct;
       if(!ok)continue;
       if(ct>now){ans=-i;ok=0;}
       now-=ct;
       if(now/100){
           cun=cun+now/100*100;
           now%=100;
       }
   }
   if(!ok)cout << ans;
   else cout << now+(int)(cun*1.2);

bool 布尔变量显示是否不够用了,不够用直接输入不用管计算部分
%为取模运算 在同余方程里面很有用
对于整数取模运算 a%b=c 可以表示 a=bx+c (a b x c皆为整数 且c<b)
如7%3=1 ; 13%3=1 ; 12%6=0.

这里看一下输出部分的强制类型转换,这个使用(int) 真的好吗?
虽然洛谷上AC了,但是在调试的时候发现:
精度
【上面是C标准输出,下面是cout输出,都是相同原理】
什!1300 * 1.2 = 1560 但是(int)(1300*1.2)=1559 ??
这里要注意了,如果double之类的精度退化到int的精度,那会发生一些奇怪误差!
可以去看看那些double强制类型转换到int 的一些帖子

注:show()函数是我自己宏定义的,定义代码为:
#define show(x) std::cerr << #x << “=” << x << std::endl

第四题 : 买铅笔[2/2]

P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有
3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少nn支铅笔最少需要花费多少钱。

思路:三种情况,一一比一下选哪种更便宜呗?
注意:尽管ceil() 是上取函数,但是里面的内容还是需要是转换到比如double类型
不然就会。。
精度2
解决措施: 把上面的 all,a1,a2 …变量都变成double类,简单粗暴

循环!循环!循环!(第一题)

第一题 : 三连击[2/4]

将1,2,3,⋯,9共9个数分成3组,分别组成3个三位数,且使这3个三位数构成1:2:3的比例,试求出所有满足条件的3个三位数。

到了循环关了,一切问题都变得有趣 复杂了起来
方法一:打表
所谓打表,就是将所有情况实现处理好,以便直接O(1)输出的方法
本题答案只有四组,那就用某些程序跑好,然后直接打表!但首先需要有程序能处理
方法二:标准全排列
首先,用dfs枚举全排列,很简单,复杂度O(n!)

#include <bits/stdc++.h>
#define show(x) std::cerr << #x << "=" << x << std::endl
using namespace std;
const int MAX = 20;		//再大就时间爆掉了
int p[MAX];				//存贮全排列数组
bool vis[MAX];			//判断某个数字是否用过
int n;					//生成n个数字全排列
void dfs(int pos){		//dfs数组,pos表示现在处理好第pos位了
    if(pos==n){			//处理完了,输出
        for(int i=1;i<=n;++i){
            printf("%d ",p[i]);
        }
        puts("");
        return ;
    }
    for(int i=1;i<=n;++i){		//pos+1位每个数都试试看
        if(vis[i])continue;		//如果i用过了,继续!
        vis[i]=true;			//这位用掉
        p[pos+1]=i;				//这位是i了
        dfs(pos+1);				//深搜下一位
        vis[i]=false;			//很重要,这位回退掉
    }
}
int main()
{
    n=5;
    dfs(0);
    return 0;
}

方法三:用下一排列函数next_permutation()
用法在我第一篇blog里,捞一捞 C++基础函数

这里我选择方法三,因为这样写的代码量实在太小啦!
然后三位一组,判断是否成1:2:3的比例就ok了
保证答案是按照每行第1个数字升序排列

int a[]={1,2,3,4,5,6,7,8,9};
    do{
        int aa=a[0]*100+a[1]*10+a[2];
        int bb=a[3]*100+a[4]*10+a[5];
        int cc=a[6]*100+a[7]*10+a[8];
        if(aa*2==bb && aa*3==cc){
            cout << aa << " " << bb << " " << cc << endl;
        }
    }while(next_permutation(a,a+9));

写了这么久这么详细就不给个赞和评论吗_(:3亅<)_

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值