洛谷新手村解题报告1-9题
我会给出每题的自我难度评分和推荐刷值,看看就好
从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类型
不然就会。。
解决措施: 把上面的 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亅<)_