先看一下这两道题目:
No.1:P1482 Cantor表(升级版)
No.2:P1534 不高兴的津津(升级版)
OK,开始正文!
第一道:P1482 Cantor表(升级版)
题目描述
现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:
这次与 NOIP1999 第一题不同的是:这次需输入两个分数(不一定是最简分数),算出这两个分数的积(注意需要约分至最简分数),输出积在原表的第几列第几行(若积形如 a(即结果为整数)或者 1/a,则看作表内的 a/1 或 1/a 结算)。
输入格式
共两行。每行输入一个分数(不一定是最简分数)。
输出格式
两个整数,表示输入的两个分数的积在表中的第几列第几行。
输入输出样例
输入 #1
4/5 5/4
输出 #1
1 1
说明/提示
数据范围
对于全部数据,两个分数的分母和分子均小于 10^4。
思路:
对于一个分数,约分后分母是行,分子是列,怎么约分?提供2种方式(以下均为函数实现):
1.用c++自带的__gcd函数(注意是两个下划线)
2.辗转相除法
下面看一下这2种方式的代码:
代码1(__gcd函数)12行:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,d;
scanf("%d/%d %d/%d",&a,&b,&c,&d);
a*=c,b*=d;
int gcd=__gcd(a,b);
a/=gcd,b/=gcd;
cout<<b<<" "<<a;
return 0;
}
代码2(自定义函数)16行
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int main()
{
int a,b,c,d;
scanf("%d/%d %d/%d",&a,&b,&c,&d);
a*=c,b*=d;
int gcdd=gcd(a,b);
a/=gcdd,b/=gcdd;
cout<<b<<" "<<a;
return 0;
}
第二道:P1534 不高兴的津津(升级版)
题目描述
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每天妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。
这次与 NOIP2004 普及组第一题不同的是:假设津津不会因为其它事不高兴,但是她的不高兴会(当然高兴也会)持续到第二天。请你帮忙检查一下津津以后 n 天的日程安排,看看以后 n 天她会不会不高兴(计算方法:用昨天不高兴程度加上今天上课总时间减去 8 后得到的数作为今天不高兴程度);输出以后 n 天结束后不高兴程度和是多少。
输入格式
第一行共一个数 n。
第二行至第 n+1 行,每行两个数,表示这天上学时间和课外补习班时间。
输出格式
一个数,这 n 天过后的不高兴程度和。
输入输出样例
输入 #1复制
7 5 3 6 2 7 2 5 3 5 4 0 4 0 6
输出 #1复制
-2
说明/提示
数据范围及约定
对于全部数据,上学时间和上课时间各不超过 8,和不超过 16,n≤3000。
思路:
直接一个循环解决,不必多说
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,sum=0,cnt=0;
cin >> n;
while(n--)
{
int s,f;
cin >> s >> f;
sum+=s+f-8;
cnt+=sum;
}
cout<<cnt;
return 0;
}
这篇博客就到这里啦,我们一会儿再见!(突然发现你们是关注不点赞收藏,点赞收藏不关注)