C/C++之(一)洛谷刷题及洛谷评测
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。
前段时间我们的实验室进行纳新,准备了一些题目,由于之前很少刷题的缘故,在这次刷题的过程中出现了很多的纰漏与问题。同时,我们选用的洛谷平台,对代码进行检查时,也会爆出各种问题,而我也不知道什么问题/(ㄒoㄒ)/~~,提交了很多次后我放弃了😄。评论区有没有大佬,或者刷题的朋友们,可以跟我分享一下刷题经验。🙇
目前正在自学C++,求大佬
关于洛谷
洛谷创建于2013年6月15日,至今已有数万用户,致力于为OIers/ACMers提供清爽、快捷的编程体验。它不仅仅是一个在线测题系统,更拥有强大的社区、在线学习功能。同时,许多教程内容都是由五湖四海的ers提供的,保证了内容的广泛性。无论是初学oi的蒟蒻,还是久经沙场的神犇,均可从洛谷Online Judge获益,也可以帮助他人,共同进步。
评测
洛谷评测系统搭建与Linux上,采用分布式集群保证评测效率,采用沙盒技术保证评测安全。目前,评测系统支持四种语言:C/C++/C++11/Pascal。其编译参数分别为:
- C:gcc -DONLINE_JUDGE -Wall -fno-asm -std=c99 -lm
- C++:g++ -DONLINE_JUDGE -Wall -fno-asm -std=c++98
- C++11:g++ -DONLINE_JUDGE -Wall -fno-asm -std=c++11
- Pascal:ppcx64 -dONLINE_JUDGE
在大牛模式下进行提交的所有题目或是有"O2优化"标签的题目在评测时均会自动开启O2优化,题目上传者或者管理员可根据需要自行开启。
各个评测状态
AC:Accept,程序通过。
CE:Compile Error,编译错误。
PC:Partially Correct,部分正确。
WA:Wrong Answer,答案错误。
RE:Runtime Error,运行时错误。
TLE:Time Limit Exceeded,超出时间限制。
MLE:Memory Limit Exceeded,超出内存限制。
OLE:Output Limit Exceeded,输出超过限制。
UKE:Unknown Error,出现未知错误。
常见“我在本地/xxOJ AC了、洛谷却不过”的原因
由于之前很少刷题的缘故,这次在洛谷刷题保守 WA 的困扰。求大佬指正!!!
【P5737】闰年展示
题目描述
输入 x,yx,y,输出 [x,y][x,y] 区间中闰年个数,并在下一行输出所有闰年年份数字,使用空格隔开。
输入格式
输入两个正整数 x,yx,y,以空格隔开。
输出格式
第一行输出一个正整数,表示 [x,y][x,y] 区间中闰年个数。
第二行输出若干个正整数,按照年份单调递增的顺序输出所有闰年年份数字。
输入输出样例
输入
1989 2001
输出
3 1992 1996 2000
说明/提示
数据保证,1582\le x < y \le 30001582≤x<y≤3000。
#include<stdio.h>
int main()
{int x,y,year,n=0,i=0,a[1000];scanf("%d %d",&x,&y);for (year =x; year <= y;year++){if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0){a[i] = year;i++;n++;}}printf("%d\n",n);for (i = 0; i < n; i++){printf("%d ",a[i]);}return 0;
}
【P5707】【深基2.例8】再分肥宅水
题目描述
现在有 tt 毫升肥宅快乐水,要均分给 nn 名同学。每名同学需要 22 个杯子。现在想知道每名同学可以获得多少毫升饮料(严格精确到小数点后 33 位),以及一共需要多少个杯子。
输入格式
输入一个实数 tt 和一个正整数 nn,使用空格隔开。
输出格式
输出两行。
第一行输出一个三位小数,表示可以获得多少毫升饮料。第二行输出一个正整数,表示一共需要多少个杯子。
输入输出样例
输入
500.0 3
输出
166.667 6
说明/提示
对于所有数据,0\leq t\leq 100000≤t≤10000 且小数点后不超过 33 位,1\leq n\leq 10001≤n≤1000。
#include<stdio.h>
int main(){float t,x;int n;scanf("%f %d",&t,&n);x=t/n;printf("%0.3f\n",x); printf("%d",n*2);
}
【P1427】 小鱼的数字游戏
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 a_iai(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
输入格式
一行内输入一串整数,以 00 结束,以空格间隔。
输出格式
一行内倒着输出这一串整数,以空格间隔。
输入输出样例
输入
3 65 23 5 34 1 30 0
输出
30 1 34 5 23 65 3
说明/提示
数据规模与约定
对于 100\%100% 的数据,保证 0 \leq a_i \leq 2^{31} - 10≤ai≤231−1,数字个数不超过 100100。
#include<stdio.h>
int main(){int array[100],i,j=1;while(j!=0){scanf("%d",&array[i]);j=array[i];i++;};int x=i-2;for(;x>=0;x--){printf("%d ",array[x]);}return 0;
}
【P1104】 生日
题目描述
cjf 君想调查学校 OI 组每个同学的生日,并按照年龄从大到小的顺序排序。但 cjf 君最近作业很多,没有时间,所以请你帮她排序。
输入格式
输入共有 22 行,
第 11 行为 OI 组总人数 nn;
第 22 行至第 n+1n+1 行分别是每人的姓名 ss、出生年 yy、月 mm、日 dd。
输出格式
输出共有 nn 行,
即 nn 个生日从大到小同学的姓名。(如果有两个同学生日相同,输入靠后的同学先输出)
输入输出样例
输入
3 Yangchu 1992 4 23 Qiujingya 1993 10 13 Luowen 1991 8 1
输出
Luowen Yangchu Qiujingya
说明/提示
数据保证,1<n<1001<n<100,1\leq |s|<201≤∣s∣<20。保证年月日实际存在,且年份 \in [1960,2020]∈[1960,2020]。
#include<bits/stdc++.h>
using namespace std;
int i,j,k,n,m;
struct sb{//结构体定义string name;//名字;int y,m,d,bian;//年,月,日,编号。
}a[1001];
int cmp(sb x,sb y){//开始结构体排序return x.y<y.y||x.y==y.y&&x.m<y.m||x.y==y.y&&x.m==y.m&&x.d<y.d||x.y==y.y&&x.m==y.m&&x.d==y.d&&x.bian>y.bian;//先按年排,再按月,日,编号。
}
int main()
{cin>>n;//输入人数for(i=1;i<=n;i++){cin>>a[i].name>>a[i].y>>a[i].m>>a[i].d;//输入a[i].bian=i;//记下输入顺序}sort(a+1,a+1+n,cmp);//开始快排for(i=1;i<=n;i++)//输出cout<<a[i].name<<endl;return 0;//完美结束
}
【P1223】 排队接水
题目描述
有 nn 个人在一个水龙头前排队接水,假如每个人接水的时间为 T_iTi,请编程找出这 nn 个人排队的一种顺序,使得 nn 个人的平均等待时间最小。
输入格式
第一行为一个整数 nn。
第二行 nn 个整数,第 ii 个整数 T_iTi 表示第 ii 个人的等待时间 T_iTi。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
输入输出样例
输入
10 56 12 1 99 1000 234 33 55 99 812
输出
3 2 7 8 1 4 9 6 10 5 291.90
说明/提示
n \leq 1000,t_i \leq 10^6n≤1000,ti≤106,不保证 t_iti 不重复。
当 t_iti 重复时,按照输入顺序即可(sort 是可以的)
#include<bits/stdc++.h>
using namespace std;
struct people{int time;int num;
}peo[1005];
bool cmp(people p1,people p2){return p1.time<p2.time;
}
int main(){int n;double sum=0,average;cin >> n; for(int i=1;i<=n;i++){cin >> peo[i].time;peo[i].num=i;} sort(peo+1,peo+n+1,cmp);for(int i=1;i<=n;i++){cout << peo[i].num << " ";sum+=(n-i)*peo[i].time;}cout << endl;average=sum/n;printf("%.2f",average);return 0;
}
【P1317】 低洼地
题目描述
一组数,分别表示地平线的高度变化。高度值为整数,相邻高度用直线连接。找出并统计有多少个可能积水的低洼地?
如图:地高变化为 0 1 0 2 1 2 0 0 2 0
输入格式
两行,第一行n,表示有n个数。第2行连续n个数表示地平线高度变化的数据,保证首尾为0。(3<=n<=10000,0<=高度<=1000)
输出格式
一个数,可能积水低洼地的数目。
输入输出样例
输入
10 0 1 0 2 1 2 0 0 2 0
输出
3
#include <stdio.h>
int main()
{int n, i, j,count = 0;scanf("%d", &n);int array[n];for(i=1;i <= n;i++){scanf("%d", &array[i]);}for(i=2;i<n;i++){if(array[i]<array[i-1]){j=1;}if(array[i]>array[i-1]&&j==1){count++;j=0;}}printf("%d",count);return 0;
}
【P1423 】小玉在游泳
题目描述
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 22 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98\%98%。现在小玉想知道,如果要游到距离 xx 米的地方,她需要游多少步呢。请你编程解决这个问题。
输入格式
输入一个实数 ss(单位:米),表示要游的目标距离。
输出格式
输出一个整数,表示小玉一共需要游多少步。
输入输出样例
输入
4.3
输出
3
说明/提示
数据保证,0 \leq s \leq 1000≤s≤100,且 ss 小数点后最多只有一位。
#include <stdio.h>
int main()
{float s;scanf("%f", &s);int x=0;float i = 2.0, sum = 0;while (s>sum){sum=sum+i;i=i*0.98;x++;}printf("%d", x);return 0;
}
【P2676】 [USACO07DEC]Bookshelf B
题目描述
Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。
所有 N(1 \le N \le 20,000)N(1≤N≤20,000) 头奶牛都有一个确定的身高 H_i(1 \le H_i \le 10,000)Hi(1≤Hi≤10,000)。设所有奶牛身高的和为S。书架的高度为B,并且保证 1 \le B \le S < 2,000,000,0071≤B≤S<2,000,000,007。
为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。
显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。
输入格式
- 第 11 行: 2 个用空格隔开的整数:NN 和 BB;
- 第 2\dots N+12…N+1 行: 第 i+1i+1 行是 11 个整数:H_iHi。
输出格式
- 第 11 行: 输出 11 个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部
输入输出样例
输入
6 40 6 18 11 13 19 11
输出
3
说明/提示
输入说明:
一共有 66 头奶牛,书架的高度为 4040,奶牛们的身高在 6\dots196…19之间。
输出说明:
一种只用 33 头奶牛就达到高度 4040 的方法:18+11+1318+11+13。当然还有其他方法,在此不一一列出了。
#include <stdio.h>
int main()
{int n, s, i, j, sum = 0, x, count = 0;scanf("%d %d", &n, &s);int array[20050];for (i = 1; i <= n; i++){scanf("%d", &array[i]);}for (i = 0; i < n; i++){for (j = i + 1; j <= n; j++){if (array[i] < array[j]){x = array[i];array[i] = array[j];array[j] = x;}}}for (i = 0; i < n; i++){sum = sum + array[i];count++;if (sum >= s){break;}}printf("%d\n", count);
}
【P1059】 [NOIP2006 普及组] 明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 NN 个 11 到 10001000 之间的随机整数 (N\leq100)(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入格式
输入有两行,第 11 行为 11 个正整数,表示所生成的随机数的个数 NN。
第 22 行有 NN 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 11 行为 11 个正整数 MM,表示不相同的随机数的个数。
第 22 行为 MM 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
输入输出样例
输入
10 20 40 32 67 40 20 89 300 400 15
输出
8 15 20 32 40 67 89 300 400
#include<stdio.h>
int main()
{int n,i,j,x;int array[100];scanf("%d", &n);for (i = 1; i <= n; i++){scanf("%d", &array[i]);}int count = 0;for (i = 1; i <= n; i++){for (j = 1; j <= n - i;j++){if (array[j] > array[j + 1]){x = array[j];array[j] = array[j + 1];array[j + 1] = x;}}}for (i = 1; i <= n; i++){if (array[i] == array[i + 1]){count++;}}printf("%d\n", n - count);for (i = 1; i <= n; i++){if (array[i] != array[i + 1]){printf("%d ", array[i]);}}return 0;
}
【P1739】 表达式括号匹配
题目描述
假设一个表达式有英文字母(小写)、运算符(+
、-
、*
、/
)和左右小(圆)括号构成,以 @
作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES
;否则输出 NO
。表达式长度小于 255255,左圆括号少于 2020 个。
输入格式
一行:表达式。
输出格式
一行:YES
或 NO
。
输入输出样例
输入
2*(x+y)/(1-x)@
输出
YES
输入
(25+x)*(a*(a+b+b)@
输出 #2复制
NO
说明/提示
表达式长度小于 255255,左圆括号少于 2020 个。
#include<bits/stdc++.h>
using namespace std;
int main(){string str;getline(cin, str);int i, k = 0;stack<char> sta;for(i = 0; i < str.length(); ++ i){if(str[i] == '(' ){sta.push(str[i]);}else if(str[i] == ')'){if(!sta.empty())sta.pop();else{k = 1;break; }}elsecontinue;}if(!sta.empty()) k = 1;if(k)cout << "NO\n";elsecout << "YES\n";return 0;
}