信息学奥赛一本通(C++版)开始的日子

	19年,结束了江苏高考的日子,作为江苏卷的倒数第二年“体验者” ,尽管自己得到的那个分数看着还算体面,但还是带着小高考的痛,给自己的高考留下了那份无法弥补的缺憾。
	高考志愿时,抱着自以为会很快培养兴趣的想法选择了计算机,从小到大的设计梦原来对于理科生来说是选择不了的,除非我不要那么要强地想要我的高考分数每一分都能尽其所用,但终究我还是要强了,和东南建筑水平以下的其他高校建筑专业say goodbye,我是真和东南有一份~~孽缘~~缘分。不得不承认我到现在还对自己是计算机大类的大一学生这一身份感到有些手足无措,不过值得欣慰的是大一上的成绩单没那么难堪。
	还是因为好强,如果可以做好,我想就要强地坚持下去吧!刚过去的一学期的程序设计C++课庆幸自己去年暑假的稍稍预习,虽然那时被我的大佬闺蜜推荐的这本初学者必备书弄的一头雾水(太难了),但开学时内心还是很感谢。似乎没有一堂课没有打过瞌睡,但还是熬着拿了这科的mj。
	20年,没有想过是这样的开头,不少玩乐后还是想做点实事。以下就是这本书的纠错。

第一部分 C++语言

第五章 数组 第一节 一维数组

校门外的树
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 27237 通过数: 14446

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

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

【输入】
第一行有两个整数L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。

【输出】
包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

【输入样例】

500 3
150 300
100 200
470 471

【输出样例】

298

【我的代码】

#include<iostream>
using namespace std;
int main()
{
	int L[10001],a[100],b[100];
	int l,n;
	cin>>l>>n;
	for(int i=0;i<=l;i++)L[i]=1;
	for(int i=0;i<n;i++)
	{	
		cin>>a[i];
		cin>>b[i];
	}
	for(int i=0;i<n;i++)
	{
		for(int j=a[i];j<=b[i];j++)
			L[j]=0;
	}
	int t=0;
	for(int i=0;i<=l;i++)
	{
	if(L[i]==1)t++;
	}
	cout<<t<<endl;
	return 0;
}

不高兴的津津
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 18180 通过数: 13105

【题目描述】
津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

【输入】
包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

【输出】
包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

【输入样例】

5 3
6 2
7 2
5 3
5 4
0 4
0 6

【输出样例】

3

【我的代码】

#include<iostream>
using namespace std;
int main()
{
	int a[8],b[8],c[8];
	memset(c,0,sizeof(c));
	for(int i=1;i<=7;i++)
	{
	cin>>a[i];
        cin>>b[i];
	if(a[i]+b[i]>8){c[i]+=1;}
	}
	int t=0;
	int largest=c[1];
	for(int i=1;i<=7;i++)
	{
		if(c[i]==0)t++;
		if(c[i]>largest)largest=c[i];
	}
	if(t==7) cout<<'0'<<endl;
	else
	{
		for(int i=1;i<=7;i++)
	{
		if(c[i]==largest)
		{
		cout<<i<<endl;
		break;
		}
	}
	}
	return 0;
}

白细胞计数
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 27166 通过数: 8719

【题目描述】
医院采样了某临床病例治疗期间的白细胞数量样本n
份,用于分析某种新抗生素对该病例的治疗效果。为了降低分析误差,要先从这n份样本中去除一个数值最大的样本和一个数值最小的样本,然后将剩余n−2个有效样本的平均值作为分析指标。同时,为了观察该抗生素的疗效是否稳定,还要给出该平均值的误差,即所有有效样本(即不包括已扣除的两个样本)与该平均值之差的绝对值的最大值。
现在请你编写程序,根据提供的n个样本值,计算出该病例的平均白细胞数量和对应的误差。

【输入】
输入的第一行是一个正整数n(2<n≤300),表明共有n个样本。以下共有n行,每行为一个浮点数,为对应的白细胞数量,其单位为109/L。数与数之间以一个空格分开。

【输出】
输出为两个浮点数,中间以一个空格分开。分别为平均白细胞数量和对应的误差,单位也是109/L。计算结果需保留到小数点后2位。

【输入样例】

5
12.0
13.0
11.0
9.0
10.0

【输出样例】

11.00 1.00

【我的代码】

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
int main()
{
	int n;
	cin>>n;
	double a[300];
	for(int i=0;i<n;i++)
		cin>>a[i];
	double largest=a[0];
	int k,l;
	double smallest=a[0];
	for(int i=0;i<n;i++)
	{
		if(a[i]>largest){largest=a[i];k=i;}
		if(a[i]<smallest){smallest=a[i];l=i;}
	}
	double sum=0;
	a[k]=0;
	a[l]=0;
	for(int i=0;i<n;i++)
	{
	if(a[i]!=0)sum+=a[i];
	}
	double ave=sum/(n-2);
	double b[300];
	int t=0;
	for(int i=0;i<n;i++)
	{	
		if(a[i]!=0)
		{
				b[t]=abs(a[i]-ave);
				t++;
		}
	}
	double larg=b[0];
	for(int i=0;i<n-2;i++)
	{
	if(b[i]>larg)larg=b[i];
	}
	cout<<fixed<<setprecision(2)<<ave<<" "<<larg<<endl;
	return 0;
}

注:“去除一个数值最大的样本和一个数值最小的样本”,也许样本中会出现几个数值等最大或最小的,但只需各去除一个即可。

铺地毯
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 18238 通过数: 8164

【题目描述】
为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有n张地毯,编号从1到n。现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上。地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的编号。注意:在矩形地毯边界和四个顶点上的点也算被地毯覆盖。

输入输出样例1说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(2,2)的最上面一张地毯是3号地毯。

输入输出样例2说明:如下图,1号地毯用实线表示,2号地毯用虚线表示,3号用双实线表示,覆盖点(4,5)的最上面没有一张地毯。

【输入】

第一行,一个整数n,表示总共有n张地毯。

接下来的n行中,第i+1行表示编号i的地毯的信息,包含四个正整数a,b,g,k,每两个整数之间用一个空格隔开,分别表示铺设地毯的左下角的坐标(a,b)以及地毯在x轴和y轴方向的长度。

第n+2行包含两个正整数x和y,表示所求的地面的点的坐标(x,y)。

【输出】
输出共1行,一个整数,表示所求的地毯的编号;若此处没有被地毯覆盖则输出-1。

【输入样例】

3
1 0 2 3
0 2 3 3
2 1 3 3
2 2

【输出样例】

3

【提示】

样例输入#2:

3
1 0 2 3
0 2 3 3
2 1 3 3
4 5

样例输出#2:

-1

【数据范围】

全部数据,1≤n≤10000

【我的代码】

#include<iostream>
using namespace std; 
int main()
{
	int n;
	cin>>n;
	const int N=10001;
	int a[N],b[N],c[N],d[N];
	for(int i=1;i<=n;i++)
	{	cin>>a[i];
		cin>>b[i];
		cin>>c[i];
		cin>>d[i];
	}
	int x,y;
	int t=0;
	cin>>x>>y;
	for(int i=n;i>=0;i--)
	{
	if(x>=a[i]&&x<=(a[i]+c[i])&&y>=b[i]&&y<=(b[i]+d[i]))
	{cout<<i<<endl;t++;break;}
	}
	if(t==0)cout<<"-1"<<endl;
	return 0;
}

遗憾,这题我的代码好像在VS2010中依旧是stack overflow,只是过了Dev。
安,wish continue。

发布了1 篇原创文章 · 获赞 4 · 访问量 215

猜你喜欢

转载自blog.csdn.net/Catherine_he_ye/article/details/104285745