洛谷 2道 “升级版” 题目 题解

发布于:2024-08-02 ⋅ 阅读:(162) ⋅ 点赞:(0)

先看一下这两道题目:

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;
}

这篇博客就到这里啦,我们一会儿再见!(突然发现你们是关注不点赞收藏,点赞收藏不关注


网站公告

今日签到

点亮在社区的每一天
去签到