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

#include
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
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
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

#include
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.yy.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<

【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
using namespace std;
struct people{
	int time;
	int num;
}peo[1005];
bool cmp(people p1,people p2){
	return p1.time> 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

C/C++之(一)洛谷刷题及洛谷评测_第1张图片

输入格式

两行,第一行n,表示有n个数。第2行连续n个数表示地平线高度变化的数据,保证首尾为0。(3<=n<=10000,0<=高度<=1000)

输出格式

一个数,可能积水低洼地的数目。

输入输出样例

输入 

10
0 1 0 2 1 2 0 0 2 0

输出 

3
#include 
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;iarray[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 
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 
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
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
using namespace std;
int main(){
	string str;
	getline(cin, str);
	int i, k = 0;
	stack 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;	
			}
		}
		else
		continue;
	}
	if(!sta.empty()) k = 1;
	if(k)
	cout << "NO\n";
	else
	cout << "YES\n";
	return 0;
}

你可能感兴趣的:(C/C++,c语言,c++,开发语言)