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++ 【模版】快速排序-CSDN博客
c++ 【深搜】题目 通过深搜遍历图【邻接矩阵存储】_c++图深度优先遍历邻接矩阵-CSDN博客