3.4 分支程序设计案例
例 3-10
不高兴的津津(洛谷P1085,NOIP2004 普及组)
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。
输入格式
输入包括7行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。
输出格式
一个数字。如果不会不高兴则输出00,如果会则输出最不高兴的是周几(用1,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。
输入输出样例
| 输入 | 输出 |
|---|---|
5 36 27 25 35 40 40 6 |
3 |
#include<iostream>
using namespace std;
int a,b,m,n;
int main()
{
m=0;
n=0;
for(int i=0;i<7;i++)
{
cin>>a>>b;
if(a+b>8 && a+b>m)
{
m=a+b;
n=i+1;
}
}
cout<<n;
return 0;
}
例 3-11
买铅笔(洛谷P1909,NOIP2016 普及组)
P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。
商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小朋 友们发礼物。
现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少n支铅笔最少需要花费多少钱。
输入
第一行包含一个正整数n,表示需要的铅笔数量。
接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种 包装内铅笔的数量,第2个整数表示这种包装的价格。
保证所有的7个数都是不超过10000的正整数。
输出
1个整数,表示P老师最少需要花费的钱。
输入输出样例
| 输入 | 输出 |
|---|---|
572 250 3030 27 |
54 |
9998128 233128 2333128 666 |
18407 |
9999101 11111 99991111 9999 |
89991 |
解答
#include<iostream>
#include<cmath>
using namespace std;
int a,b,c,n,p;
int main()
{
p=10000*10000;
cin>>n;
for(int i=0;i<3;i++)
{
cin>>a>>b;
c=ceil(n*1.0/a);
p=min(b*c,p);
}
cout<<p;
return 0;
}
参考
floor(10.5) == 10 floor(-10.5) == -11
ceil(10.5) == 11 ceil(-10.5) ==-10
例 3-12
ISBN(洛谷P1055,NOIP2008 普及组)
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如
0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符-之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码
0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,...,9再求和,即0×1+6×2+……+2×9=158,然后取158mod11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出
Right;如果错误,则输出你认为是正确的ISBN号码。
输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出
Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。
输入输出样例
| 输入 | 输出 |
|---|---|
0-670-82162-4 |
Right |
0-670-82162-0 |
0-670-82162-4 |
解答
#include<iostream>
#include<stdio.h>
using namespace std;
char a[13];
int b,c,d;
int main()
{
gets(a);
b=1;
c=0;
for(int i=0;i<11;i++)
{
if(a[i]=='-')
continue;
d=a[i]-'0'; //转换成数字
c=c+d*b;
b++;
}
d = c%11;
if(d==a[12]-'0') //转换成数字比较
cout<<"Right";
else if(d == 10 && a[12] == 'X')
cout<<"Right";
else
{
if(d==10)
a[12] = 'X';
else
a[12] = c%11+48; //数字转换成字符
puts(a);
}
return 0;
}

浙公网安备 33010602011771号