菜鸟洛谷打卡day01
锻炼脑思维,谨防死机
part 1:洛谷第一个任务**
题目介绍:小鱼的游泳时间
伦敦奥运会要到了,小鱼在拼命练习游泳准备参加游泳比赛,可怜的小鱼并不知道鱼类是不能参加人类的奥运会的。
这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?
小鱼游的好辛苦呀,你可不要算错了哦。
输入输出格式
输入格式:
一行内输入 4 个整数,分别表示 a, b, c, d。
输出格式:
一行内输出 2 个整数 e 和 f,用空格间隔,依次表示小鱼这天一共游了多少小时多少分钟。其中表示分钟的整数 f 应该小于60。
输入格式:
12 50 19 10
输出格式:
6 20
解题思路
小鱼的游泳时间:
1.选择00:00作为标准,将时间全部化成分钟数,在将相应的时间换成相应的小时和分钟,按照相应的格式输出。
2.进行相应的条件判断,当第二个时间的分钟数大于第一个时,第二个分钟数小于第一个时间时,将相应的小时数减一,分钟数加60进行计算,注意进制的转化就ok
源代码
#include<stdio.h>
int main(){
int a,b,c,d,e,f;
scanf("%d%d%d%d",&a,&b,&c,&d);
int sum1=a*60+b;
int sum2=c*60+d;
int sum3=sum2-sum1;
e=sum3/60;
f=sum3-e*60;
printf("%d %d\n",e,f);
return 0;
}
part 2 :顺序与分支
01 题目介绍:小玉家的电费
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入输出格式
输入格式:
输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。
输出格式:
输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)。
输入格式:267
输出格式:121.5
解题思路
小玉家的电费:
注意浮点的范围,直接将其改为double,当要采用四舍五入的时候,可以将(数字*10+0.50)/10,既可以完成四舍五入
源代码
#include<stdio.h>
int main(){
int a=0;
double b=0;
scanf("%d",&a);
if(a<=150){
b=0.4463*a;
}
else if(a>=151&&a<=400){
b=150*0.4463+(a-150)*0.4663;
}
else{
b=150*0.4463+250*0.4663+(a-400)*0.5663;
}
b=int(b*10+0.5)/10.0;
printf("%.1f\n",b);
return 0;
}
02 题目介绍:不高兴的津津
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
输入输出格式
输入格式:
输入包括77行数据,分别表示周一到周日的日程安排。每行包括两个小于1010的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
输出格式:
一个数字。如果不会不高兴则输出00,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 71,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
输入格式:
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出格式:
3
解题思路
不高兴的津津:注意将每个月的剩余计算清楚,逻辑一定要清楚
源代码
#include<iostream>
using namespace std;
int main(){
int a[13]={0},b[13]={0},i=0,flag=1,sum=0;
for(i=1;i<13;i++){
cin>>a[i];
}
int lea=300-a[1];
for(i=2;i<13;i++){
b[i]=300+lea;
if(b[i]<a[i])
{
cout<<"-"<<i<<endl;
flag=0;
break;
}
else
lea=b[i]-a[i];
int j=lea/100;
if(j!=0)
{
lea=lea-j*100;
sum+=j*100;
}
}
03 题目介绍:津津的存储计划
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上20%20%还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100100元或恰好100100元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如1111月初津津手中还有8383元,妈妈给了津津300300元。津津预计1111月的花销是180180元,那么她就会在妈妈那里存200200元,自己留下183183元。到了1111月月末,津津手中会剩下33元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。
输入输出格式
输入格式:
1212行数据,每行包含一个小于350350的非负整数,分别表示11月到1212月津津的预算。
输出格式:
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出-X−X,XX表示出现这种情况的第一个月;否则输出到20042004年年末津津手中会有多少钱。
注意,洛谷不需要进行文件输入输出,而是标准输入输出。
输入格式:
290
230
280
200
300
170
340
50
90
80
200
60
输出格式:
-7
输入格式:
290
230
280
200
300
170
330
50
90
80
200
60
输出格式:
1580
解题思路
思路:将每个笔的数量以及包装作为相应数组的值,在计算相应需要的数量,对于小数的产生,可以采用先取地板函数(floor)在加1,或者将最后结果取ceil函数。
源代码
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int a,b[4],c[4],d[4];
cin>>a;
int num=0;
for(int i=0;i<3;i++)
{
cin>>b[i]>>c[i];
if(a%b[i])
num=( floor(a/b[i]))+1;
else
num=a/b[i];
d[i]=num*c[i];
}
int min=d[0];
for(int i=1;i<3;i++)
{if(d[i]<min)
min=d[i];
}
cout<<min<<endl;
return 0;
}
part 3:循环
01题目介绍:津津的存储计划
题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。
输入输出格式
输入格式:
木有输入
输出格式:
若干行,每行33个数字。按照每行第11个数字升序排列。
输入格式:
无
输出格式:
192 384 576
* * *
...
* * *
(输出被和谐了)
解题思路1
思路1:使用三重循环,作为构成a的百位,十位,个位,将2a,3a作为,b,c再调用专门的返回该整数含有数字的个数的函数,函数思路:根据需要,设置全局变量d[9],数组里面的每一个数字代表下表数字出现的次数,调用完毕之后,在主函数里面将数组的值全部清零。
该函数为:
int gw;
int d[9];
int cf(int x){
while(x!=0){
gw=x%10;
x=(x-gw)/10;
d[gw]++;
}
}
源代码
#include<iostream>
using namespace std;
int gw;
int d[9];
int cf(int x){
while(x!=0){
gw=x%10;
x=(x-gw)/10;
d[gw]++;
}
}
int main(){
int a,b,c;
for (int i=1;i<=9;i++)
for (int j=1;j<=9;j++)
for (int k=1;k<=9;k++){
a=i*100+j*10+k;
b=a*2;
c=a*3;
cf(a);
cf(b);
cf(c);
if(d[1]==1&&d[2]==1&&d[3]==1&&d[4]==1&&d[5]==1&&d[6]==1&&d[7]==1&&d[8]==1&&d[9]==1){
cout<<a<<" "<<b<<" "<<c<<endl;
}
for (int e=1;e<=9;e++){
d[e]=0;
}
}
return 0;
}
解题思路2
使用全排列,包含相应的头文件#include
调用算法库里面的函数,将数字1~9全部混合,每一遍混合都组成新的a,b,c,进行条件判断是否满足比例关系。
源代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a,b,c,arr[9]={1,2,3,4,5,6,7,8,9};
do{
a=arr[0]*100+arr[1]*10+arr[2];
b=arr[3]*100+arr[4]*10+arr[5];
c=arr[6]*100+arr[7]*10+arr[8];
if((b==a*2)&&(c==a*3))
cout<<a<<" "<<b<<" "<<c<<endl;
}while(next_permutation(arr,arr+9));
return 0;
}
02题目介绍:计数问题
题目描述
试计算在区间 11 到 n n的所有整数中,数字 x(0 ≤ x ≤ 9)x(0≤x≤9)共出现了多少次?例如,在 11到 11 11中,即在 1,2,3,4,5,6,7,8,9,10,111,2,3,4,5,6,7,8,9,10,11 中,数字 11 出现了 44 次。
输入输出格式
输入格式:
22个整数n,xn,x,之间用一个空格隔开。
输出格式:
11个整数,表示xx出现的次数。
输入格式:
11 1
输出格式:
4
解题思路
思路:使用枚举的方法,在循环里面调用返回数字次数的函数,在通过条件判断,当与数组的下标相等时,返回该下表记录的值,即为该数字出现的次数。
源代码
#include<iostream>
#define maxn 1000000
using namespace std;
int gw;
int d[10];
int cf(int x){
while(x!=0){
gw=x%10;
x=(x-gw)/10;
d[gw]++;
}
}
int main(){
int n,b;
cin>>n>>b;
for(int i=1;i<=n;i++){
cf(i);
}
cout<<d[b]<<endl;
for (int e=0;e<=9;e++){
d[e]=0;
}
return 0;
}