ccf刷题第四天c++(20150301,20160901,20161201)

1. 图像旋转(20150301)

【问题描述】
旋转是图像处理的基本操作,在这个问题中,你需要将一个图像逆时针旋转90度。
计算机中的图像表示可以用一个矩阵来表示,为了旋转一个图像,只需要将对应的矩阵旋转即可。
【输入格式】
输入的第一行包含两个整数n, m,分别表示图像矩阵的行数和列数。
接下来n行每行包含m个整数,表示输入的图像。
【输出格式】
输出m行,每行包含n个整数,表示原始矩阵逆时针旋转90度后的矩阵。
【样例输入】
2 3
1 5 3
3 2 4
【样例输出】
3 4
5 2
1 3
【评测用例规模与约定】
1 ≤ n, m ≤ 1,000,矩阵中的数都是不超过1000的非负整数。

思路

这个题目系统评测只有80分,如果发现有什么问题,请留言告知,我将不胜感激。
思路如下:
根据输入的n和m,输入一个n行m列的二维数组,然后观察逆时针旋转90度之后,行、列下标之间的关系,然后输出就可以啦。(开始我用一个mxn的二维数组存输出的数组,有点麻烦)。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,m;
	cin>>n>>m;
	int vec[n][m];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>vec[i][j];
	//直接输出数组,不需要存储在其他数组中再输出 
	for(int j=1;j<=m;j++){
		for(int i=0;i<n;i++){
			if(i!=0) cout<<" ";
			cout<<vec[i][m-j];
		}
		cout<<endl;
	} 
	return 0;
}  

2. 最大波动(20160901)

【问题描述】
小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。
【输入格式】
输入的第一行包含了一个整数n,表示小明拿到的收盘价格的连续天数。
第二行包含n个正整数,依次表示每天的收盘价格。
【输出格式】
输出一个整数,表示这只股票这n天中的最大波动值。
【样例输入】
6
2 5 5 7 3 5
【样例输出】
4
【样例说明】
第四天和第五天之间的波动最大,波动值为|3-7|=4。
【评测用例规模与约定】
对于所有评测用例,2 ≤ n ≤ 1000。股票每一天的价格为1到10000之间的整数。

思路

思路如下:
输入一个整数n,输入n个整数;从i=0开始遍历,计算下标为i-1与下标为i的值之间的绝对值,求出差值最大的值,即为最大波动。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,max=0;
	cin>>n;
	vector<int> vec(n);
	for(int i=0;i<n;i++)
		cin>>vec[i];
	for(int i=1;i<n;i++){
		if(abs(vec[i-1]-vec[i])>=max) 
			max=abs(vec[i-1]-vec[i]);
	}
	cout<<max;
	return 0;
} 

3. 中间数(20161201)

【问题描述】
在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
给定一个整数序列,请找出这个整数序列的中间数的值。
【输入格式】
输入的第一行包含了一个整数n,表示整数序列中数的个数。
第二行包含n个正整数,依次表示a1, a2, …, an。
【输出格式】
如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
【样例输入】
6
2 6 5 6 3 5
【样例输出】
5
【样例说明】
比5小的数有2个,比5大的数也有2个。
【样例输入】
4
3 4 6 7
【样例输出】
-1
【样例说明】
在序列中的4个数都不满足中间数的定义。
【样例输入】
5
3 4 6 6 7
【样例输出】
-1
【样例说明】
在序列中的5个数都不满足中间数的定义。
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。

思路

思路如下:
(1)根据输入的n值,输入n个整数;
(2)从i=0开始遍历数组,比较下标为i的值与数组中其他值的大小关系,如果vec[i]>vec[j],则记录比vec[i]大的数的变量maxnum加一,同理如果vec[i]<vec[j],则记录比vec[i]小的数的变量minnum加一,最后比较minnum与maxnum之间的关系,如果相等,则说明vec[i]是中间数;否则minnum和maxunm赋值为0,然后继续去判断下标为i+1的值与数组中其他值之间的大小关系。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,k=-1,minnum,maxnum;
	cin>>n;
	vector<int> vec(n);
	for(int i=0;i<n;i++)
		cin>>vec[i];
	//核心代码 
	for(int i=0;i<n;i++){
		minnum=0;
		maxnum=0; 
		for(int j=0;j<n;j++){
			if(vec[j]>vec[i]) maxnum++;
			if(vec[j]<vec[i]) minnum++;
		}
		if(minnum==maxnum)
			k=vec[i];
	}
	cout<<k;
	return 0;
}

版权声明:本文为SoniaPan原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。