洛谷刷题(4)

P1089 [NOIP2004 提高组] 津津的储蓄计划

题目描述

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。

为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100元或恰好 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如 11月初津津手中还有 83 元,妈妈给了津津 300 元。津津预计11月的花销是 180 元,那么她就会在妈妈那里存 200 元,自己留下 183 元。到了 11 月月末,津津手中会剩下 3 元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。

现在请你根据 2004 年 1 月到 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 年年末,妈妈将津津平常存的钱加上 20% 还给津津之后,津津手中会有多少钱。

输入格式

12 行数据,每行包含一个小于 350 的非负整数,分别表示 11 月到 12 月津津的预算。

输出格式

一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 −X,X 表示出现这种情况的第一个月;否则输出到 2004 年年末津津手中会有多少钱。

注意,洛谷不需要进行文件输入输出,而是标准输入输出。

 代码

#include<stdio.h>
int main() {
	int a[20], ans = 0, b = 0;
	for (int i = 1; i <= 12; i++) {
		scanf("%d", &a[i]);
	}
	for (int i = 1; i <= 12; i++) {
		b += 300 - a[i];
		if (b >= 100) {
			ans += b / 100;
			b = b % 100;
		}
		if (b < 0) {
			printf("-%d\n", i);
			return 0;
		}
	}
	printf("%d", 120 * ans+b);
	return 0;
}

 P1014 [NOIP1999 普及组] Cantor 表

题目描述

现代数学的著名证明之一是 Georg Cantor 证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:

我们以 Z 字形给上表的每一项编号。第一项是 1/1,然后是 1/2,2/1,3/1,2/2,…

输入格式

整数N(1≤N≤107)。

输出格式

表中的第 N 项。

得到规律

代码

#include<stdio.h>
int main() {
	int n = 0;
	scanf("%d", &n);//第几个
	int a=0, b=n;
	while (b > 0) {
		b = n;
		a++;
		b = b - (a + 1) * a / 2;
        //求区间	<-b减去的是一个等差数列求和公式,主要是为了求出n位于哪一个区间
	}
	if (a % 2 == 0) {
		printf("%d/%d\n", a + b, 1 - b);
	}
	else {
		printf("%d/%d\n", 1 - b, a + b);
	}
	return 0;
}

P5015 [NOIP2018 普及组] 标题统计

题目背景

NOIP2018 普及组 T1

题目描述

凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。

输入格式

输入文件只有一行,一个字符串 s。

输出格式

输出文件只有一行,包含一个整数,即作文标题的字符数(不含空格和换行符)。

代码

#include<stdio.h>
#include<string.h>

int main() {
	char a[200000];
	//scanf("%s", a);
	fgets(a, sizeof(a), stdin); 
	int count = 0;
	int len = strlen(a);
	for (int i = 0; i < len-1; i++) {
		if (a[i] == ' ')continue;
		count++;
	}
	printf("%d", count);
	return 0;
}

P8830 [传智杯 #3 练习赛] 评委打分

题目描述

小 A 参加一个综艺节目。一共有 n(3≤n≤106) 名评委参与打分(分数范围是 0 到 100 的整数),每个评委依次亮出自己的得分。

为了节目效果,要求从第三个评委开始,每当第 ii 个评委给出打分后,立刻计算出出这个选手在前 ii 名评委的打分中,去掉一个最高分和一个最低分,剩下 i−2个评委的平均分,保留 2 位小数。

输入格式

第一行输入一个整数 n,表示评委人数。

第二行输出 n 个整数,表示各个评委的打分。

输出格式

输出共 n−2行,每行表示对应的答案。

代码

#include<stdio.h>
#include<iostream>
using namespace std;
int n, a[1020000];
double ans;
int maxx, minn;
int main() {
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	maxx = a[1], minn = a[1];
	for (int i = 1; i <= n; i++) {
		ans += 1.0*a[i];
		maxx = max(a[i], maxx);
		minn = min(a[i], minn);
		if (i >= 3)
			printf("%.2lf\n", (ans - maxx - minn) / (i - 2));
	}


	return 0;
}

P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目描述

小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O 的数目不足 V 时,无法继续冶炼。

现在给出了 N 条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O 不会累加到下一次的冶炼当中。

根据这 N 条冶炼记录,请你推测出转换率 V 的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。

输入格式

第一行一个整数 N,表示冶炼记录的数目。

接下来输入 N 行,每行两个整数 A,B,含义如题目所述。

输出格式

输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。

代码

#include<stdio.h>
long long int maxx=999999999, minn=-1,a,b;
int n;
int max(int x, int y) {
	return x > y ? x : y;
}
int min(int x, int y) {
	return x < y ? x : y;
}
int main() {
	
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d%d", &a, &b);
		minn = max(minn, int(double(a * 1.0 / (b + 1))) + 1);
		maxx = min(maxx, int(double(a * 1.0 / b)));
	}
	printf("%d %d", minn, maxx);
	return 0;
}

 P1012 [NOIP1998 提高组] 拼数

题目描述

设有 n 个正整数 a1…an​,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 n。

第二行有 n 个整数,表示给出的 n 个整数 ai​。

输出格式

一个正整数,表示最大的整数

代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
string a[30];
bool cmp(const string& a, const string& b) {
	return (a + b > b + a);
}
int main() {
	scanf("%d", &n);
    getchar();
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	sort(a + 1, a + n + 1, cmp);
	for (int i = 1; i <= n; i++) {
		cout << a[i];
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值