• 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

    1. #include
    2. int main()
    3. {
    4. int x,y,year,n=0,i=0,a[1000];
    5. scanf("%d %d",&x,&y);
    6. for (year =x; year <= y;year++)
    7. {
    8. if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    9. {
    10. a[i] = year;
    11. i++;
    12. n++;
    13. }
    14. }
    15. printf("%d\n",n);
    16. for (i = 0; i < n; i++)
    17. {
    18. printf("%d ",a[i]);
    19. }
    20. return 0;
    21. }

    【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。

    1. #include
    2. int main(){
    3. float t,x;
    4. int n;
    5. scanf("%f %d",&t,&n);
    6. x=t/n;
    7. printf("%0.3f\n",x);
    8. printf("%d",n*2);
    9. }

    【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。

    1. #include
    2. int main(){
    3. int array[100],i,j=1;
    4. while(j!=0){
    5. scanf("%d",&array[i]);
    6. j=array[i];
    7. i++;
    8. };
    9. int x=i-2;
    10. for(;x>=0;x--){
    11. printf("%d ",array[x]);
    12. }
    13. return 0;
    14. }

    【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

    1. #include
    2. using namespace std;
    3. int i,j,k,n,m;
    4. struct sb{//结构体定义
    5. string name;//名字;
    6. int y,m,d,bian;//年,月,日,编号。
    7. }a[1001];
    8. int cmp(sb x,sb y){//开始结构体排序
    9. return x.yy.bian;
    10. //先按年排,再按月,日,编号。
    11. }
    12. int main()
    13. {
    14. cin>>n;//输入人数
    15. for(i=1;i<=n;i++){
    16. cin>>a[i].name>>a[i].y>>a[i].m>>a[i].d;//输入
    17. a[i].bian=i;//记下输入顺序
    18. }
    19. sort(a+1,a+1+n,cmp);//开始快排
    20. for(i=1;i<=n;i++)//输出
    21. cout<
    22. return 0;//完美结束
    23. }

    【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 是可以的)

    1. #include
    2. using namespace std;
    3. struct people{
    4. int time;
    5. int num;
    6. }peo[1005];
    7. bool cmp(people p1,people p2){
    8. return p1.time
    9. }
    10. int main(){
    11. int n;
    12. double sum=0,average;
    13. cin >> n;
    14. for(int i=1;i<=n;i++){
    15. cin >> peo[i].time;
    16. peo[i].num=i;
    17. }
    18. sort(peo+1,peo+n+1,cmp);
    19. for(int i=1;i<=n;i++){
    20. cout << peo[i].num << " ";
    21. sum+=(n-i)*peo[i].time;
    22. }
    23. cout << endl;
    24. average=sum/n;
    25. printf("%.2f",average);
    26. return 0;
    27. }

    【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
    1. #include
    2. int main()
    3. {
    4. int n, i, j,count = 0;
    5. scanf("%d", &n);
    6. int array[n];
    7. for(i=1;i <= n;i++)
    8. {
    9. scanf("%d", &array[i]);
    10. }
    11. for(i=2;i
    12. if(array[i]-1]){
    13. j=1;
    14. }
    15. if(array[i]>array[i-1]&&j==1){
    16. count++;
    17. j=0;
    18. }
    19. }
    20. printf("%d",count);
    21. return 0;
    22. }

    【P1423 】小玉在游泳


    题目描述

    小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 22 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98\%98%。现在小玉想知道,如果要游到距离 xx 米的地方,她需要游多少步呢。请你编程解决这个问题。

    输入格式

    输入一个实数 ss(单位:米),表示要游的目标距离。

    输出格式

    输出一个整数,表示小玉一共需要游多少步。

    输入输出样例

    输入 

    4.3

    输出 

    3

    说明/提示

    数据保证,0 \leq s \leq 1000≤s≤100,且 ss 小数点后最多只有一位。

    1. #include
    2. int main()
    3. {
    4. float s;
    5. scanf("%f", &s);
    6. int x=0;
    7. float i = 2.0, sum = 0;
    8. while (s>sum)
    9. {
    10. sum=sum+i;
    11. i=i*0.98;
    12. x++;
    13. }
    14. printf("%d", x);
    15. return 0;
    16. }

    【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。当然还有其他方法,在此不一一列出了。

    1. #include
    2. int main()
    3. {
    4. int n, s, i, j, sum = 0, x, count = 0;
    5. scanf("%d %d", &n, &s);
    6. int array[20050];
    7. for (i = 1; i <= n; i++)
    8. {
    9. scanf("%d", &array[i]);
    10. }
    11. for (i = 0; i < n; i++)
    12. {
    13. for (j = i + 1; j <= n; j++)
    14. {
    15. if (array[i] < array[j])
    16. {
    17. x = array[i];
    18. array[i] = array[j];
    19. array[j] = x;
    20. }
    21. }
    22. }
    23. for (i = 0; i < n; i++)
    24. {
    25. sum = sum + array[i];
    26. count++;
    27. if (sum >= s)
    28. {
    29. break;
    30. }
    31. }
    32. printf("%d\n", count);
    33. }

    【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
    

    1. #include
    2. int main()
    3. {
    4. int n,i,j,x;
    5. int array[100];
    6. scanf("%d", &n);
    7. for (i = 1; i <= n; i++)
    8. {
    9. scanf("%d", &array[i]);
    10. }
    11. int count = 0;
    12. for (i = 1; i <= n; i++)
    13. {
    14. for (j = 1; j <= n - i;j++)
    15. {
    16. if (array[j] > array[j + 1])
    17. {
    18. x = array[j];
    19. array[j] = array[j + 1];
    20. array[j + 1] = x;
    21. }
    22. }
    23. }
    24. for (i = 1; i <= n; i++)
    25. {
    26. if (array[i] == array[i + 1])
    27. {
    28. count++;
    29. }
    30. }
    31. printf("%d\n", n - count);
    32. for (i = 1; i <= n; i++)
    33. {
    34. if (array[i] != array[i + 1])
    35. {
    36. printf("%d ", array[i]);
    37. }
    38. }
    39. return 0;
    40. }

    【P1739】 表达式括号匹配


    题目描述

    假设一个表达式有英文字母(小写)、运算符(+-*/)和左右小(圆)括号构成,以 @ 作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则输出 YES;否则输出 NO。表达式长度小于 255255,左圆括号少于 2020 个。

    输入格式

    一行:表达式。

    输出格式

    一行:YES 或 NO

    输入输出样例

    输入

    2*(x+y)/(1-x)@
    

    输出

    YES
    

    输入 

    (25+x)*(a*(a+b+b)@
    

    输出 #2复制

    NO
    

    说明/提示

    表达式长度小于 255255,左圆括号少于 2020 个。

    1. #include
    2. using namespace std;
    3. int main(){
    4. string str;
    5. getline(cin, str);
    6. int i, k = 0;
    7. stack<char> sta;
    8. for(i = 0; i < str.length(); ++ i)
    9. {
    10. if(str[i] == '(' )
    11. {
    12. sta.push(str[i]);
    13. }
    14. else if(str[i] == ')')
    15. {
    16. if(!sta.empty())
    17. sta.pop();
    18. else
    19. {
    20. k = 1;
    21. break;
    22. }
    23. }
    24. else
    25. continue;
    26. }
    27. if(!sta.empty()) k = 1;
    28. if(k)
    29. cout << "NO\n";
    30. else
    31. cout << "YES\n";
    32. return 0;
    33. }

  • 相关阅读:
    回溯算法的奥秘(LeetCode),组合77题、216题、40题
    第一行代码Android 第十章 10.1-10.2(服务,线程,子线程中更新UI,异步消息处理机制,AsyncTask异步消息处理工具)
    ​⚠️ 警告:JetBrains TeamCity 中的趋势 CVE-2023-42793​
    设计模式-概述*
    [RPC] Motan快速开始
    不就是Java吗之数组的定义和使用
    【前端】for循环中 使用 v-model:value 导致引用重复
    JAVA面试笔记
    Qt (QFileDialog&QColorDialog&QFontDialog) 对话框实战
    2310C++构造对象
  • 原文地址:https://blog.csdn.net/m0_63244368/article/details/127458436