c++_爆刷n题

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

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

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

例如 1111月初津津手中还有 8383 元,妈妈给了津津 300300 元。津津预计1111月的花销是 180180 元,那么她就会在妈妈那里存 200200 元,自己留下 183183 元。到了 1111 月月末,津津手中会剩下 33 元钱。

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

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

输入格式
1212 行数据,每行包含一个小于 350350 的非负整数,分别表示 11 月到 1212 月津津的预算。

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

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

输入输出样例
输入 #1复制

290
230
280
200
300
170
340
50 
90 
80 
200
60 
输出 #1复制

-7 
输入 #2复制

290 
230 
280 
200 
300 
170 
330 
50 
90 
80 
200 
60 
主要思路是对12个月份的支出进行统计,并计算出一个年度的总支出。在每个月份,你从标准的300个小时开始,然后减去这个月的支出。如果这个月的支出导致剩余的小时数为负数,程序会输出负数的月份,并结束程序。最后,程序会输出年度的总支出,考虑到1.2的兑换率。

#include <iostream>
using namespace std;
 
const int m = 300;
 
int main() {
    int h = 0, s = 0;       // 定义变量h和s,分别表示小时和总金额
    int a;                  // 定义变量a,用于存储输入的金额
    for (int i = 1; i < 13; i++) {
        cin >> a;           // 输入金额
        h += m;             // 每次循环累加300小时到h
        if (h < a) {
            cout << -i;     // 如果h小于a,则输出负的i,并结束程序
            return 0;
        }
        int left = h - a;   // 计算剩余的金额
        h = left % 100;     // 将剩余的金额转换为小时
        s += left - h;      // 累加剩余的金额到s
    }
    cout << s * 1.2 + h;    // 输出总金额,使用1.2作为兑换率
    return 0;
}

P1093 [NOIP2007 普及组] 奖学金
题目背景
NOIP2007 普及组 T1

题目描述
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前 55 名学生发奖学金。期末,每个学生都有 33 门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。

任务:先根据输入的 33 门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。

注意,在前 55 名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:

7 279  
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是 77 号、55 号。这两名同学的总分都是 279279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为 77 的学生语文成绩更高一些。

如果你的前两名的输出数据是:

5 279  
7 279
则按输出错误处理,不能得分。

输入格式
共 𝑛+1n+1 行。

第 11 行为一个正整数 𝑛≤300n≤300,表示该校参加评选的学生人数。

第 22 到 𝑛+1n+1 行,每行有 33 个用空格隔开的数字,每个数字都在 00 到 100100 之间。第 𝑗j 行的 33 个数字依次表示学号为 𝑗−1j−1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为 1∼𝑛1∼n(恰好是输入数据的行号减 11)。

保证所给的数据都是正确的,不必检验。

输出格式
共 55 行,每行是两个用空格隔开的正整数,依次表示前 55 名学生的学号和总分。

输入输出样例
输入 #1复制

6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
输出 #1复制

6 265
4 264
3 258
2 244
1 237

输入 #2复制

8
80 89 89
88 98 78
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
输出 #2复制

8 265
2 264
6 264
1 258
5 258
根据输入的学生成绩,先计算总分,然后按照规则进行排序,最后输出前五名学生的学号和总分。

在这段代码中,你首先读取一个整数n,表示学生的人数。接下来的n行中,每行包含三个用空格隔开的数字,表示学生的语文、数学和英语成绩。

然后,程序根据总分和规则进行排序。排序规则是先按照总分从高到低排序,如果两个学生的总分相同,再按照语文成绩从高到低排序,如果总分和语文成绩也相同,那么学号小的学生排在前面。

最后,程序输出前五名学生的学号和总分。

#include<bits/stdc++.h>
using namespace std;
struct stu{//学生信息
	int Id;
	int yw;
	int sx;
	int yy;
	int sum;
};stu a[301];
bool cmp(stu a,stu b){
	if(a.sum>b.sum)return true;
	else if(a.sum==b.sum && a.yw>b.yw)
		return true;
	else if(a.sum==b.sum && a.yw==b.yw && a.Id<b.Id) 
		return true;
	else
		return false;
}
int main(){
	int n,i;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d%d%d",&a[i].yw,&a[i].sx,&a[i].yy);
		a[i].sum=a[i].yw+a[i].sx+a[i].yy;
		a[i].Id=i;
	}
	sort(a+1,a+n+1,cmp);
	for(i=1;i<=5;i++)printf("%d %d\n",a[i].Id,a[i].sum);
	return 0;
}

4和5

题目描述
FinnFinn 非常喜欢 44 和 55,他认为所有的数都可以用 44 和 55 进行相加得出。

例:

14=5+5+414=5+5+4

20=4+4+4+4+420=4+4+4+4+4 或 20=5+5+5+520=5+5+5+5

40=4+4+4+4+4+4+4+4+4+440=4+4+4+4+4+4+4+4+4+4 或 40=4+4+4+4+4+5+5+5+540=4+4+4+4+4+5+5+5+5 或 40=5+5+5+5+5+5+5+540=5+5+5+5+5+5+5+5

当然,44 和 55 的顺序并不重要,重要的是他们的个数。

给你一个正整数 𝑛n,问有多少种方法可以用 44 和 55 拼凑成 𝑛n。

输入格式
一行,一个整数 𝑛n,表示要被拼凑的数。

输出格式
一行,表示方法的数量。如果这个数不能被拼凑,请输出 00。

输入输出样例
输入 #1复制

14
输出 #1复制

1
输入 #2复制

40
输出 #2复制

3
输入 #3复制

6
输出 #3复制

0
说明/提示
对于 20%20% 的数据:1≤𝑛≤101≤n≤10

对于另外 15%15% 的数据:1≤𝑛≤1051≤n≤105 并且保证 𝑛≡0n≡0 (mod4)(mod4)

对于另外 15%15% 的数据:1≤𝑛≤1051≤n≤105 并且保证 𝑛≡0n≡0 (mod5)(mod5)

对于 100%100% 的数据:1≤𝑛≤1061≤n≤106

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,ans=0;
	cin>>n;//给的数字
	for(int i=0;i<=n/4;i++)//枚举4的个数
	{
		if((n-i*4)%5==0)//如果剩下部分5能处进
		{
			ans++;//答案++
		}
	}
	cout<<ans;//输出答案
	return 0; //return 0是个好习惯 
}

校门外的树 ACGO

入门

NOIP普及组

通过率:66.24%

加入题单

题目描述
某校大门外长度为 𝑙l 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 𝑙l 的位置;数轴上的每个整数点,即 0,1,2,....,𝑙0,1,2,....,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式
第一行有两个整数,分别表示马路的长度 𝑙l 和区域的数目 𝑚m。

接下来 𝑚m 行,每行两个整数 𝑢,𝑣u,v,表示一个区域的起始点和终止点的坐标。

输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例
输入#1

复制
500 3
150 300
100 200
470 471
输出#1

复制
298
说明/提示
【数据范围】

对于 20%20% 的数据,保证区域之间没有重合的部分。
对于 100%100% 的数据,保证 1≤𝑙≤1041≤l≤104,1≤𝑚≤1001≤m≤100,0≤𝑢≤𝑣≤𝑙0≤u≤v≤l。
【题目来源】

NOIP 2005 普及组第二题

#include<bits/stdc++.h>
using namespace std;
int a[10005];//模拟整个路段
int l,m,b,g;//l代表树的数量,m代表地铁的区域数,b代表地铁路段开始的坐标,g代表地铁路段结束的坐标
int main(){
	cin>>l>>m;
	for(int i=1;i<=m;i++){
		cin>>b>>g;
		for(int j=b;j<=g;j++){
			if(a[j]==0){
				l--;
				a[j] = 1;
			}
		}
	}
	cout<<l+1;
	
	return 0;
}

更多题目

c++__T303369 nzhtl1477-ただいま帰りました-CSDN博客

c++_画矩形_c++画矩形-CSDN博客

c++ 【模版】快速排序-CSDN博客

c++ 【深搜】题目 通过深搜遍历图【邻接矩阵存储】_c++图深度优先遍历邻接矩阵-CSDN博客

c++_约瑟夫问题 题解_【例60.2】 约瑟夫问题-CSDN博客

吃菠萝的狼-CSDN博客

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值