ccf刷题第二天c++(20140301,20140901,20141201)

1. 相反数(20140301)

【问题描述】
  有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
【输入格式】
  第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
  第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。
【输出格式】
  只输出一个整数,即这 N 个数中包含多少对相反数。
【样例输入】
5
1 2 3 -1 -2
【样例输出】
2

(自己的)思路

可能最近喜欢用桶排序的方法,总是不由自主的往桶排序的方向去想。
基于相反数这道题,思路如下:
(1)根据输入的数进行判断,如果输入的数number是正数,则存入nums[number]中,否则(即为负数时)存入nums[-number]中
(2)重新开始遍历数组nums,如果nums[i]的值大于等于2,则说明存在相反数对(自己感觉这里有点问题,待改进,但是oj竟然没有算错)

实现代码(还存在问题)

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,number,sum=0;
	cin>>n;
	int nums[1001]={0};
	for(int i=0;i<n;i++){
		cin>>number;
		if(number<0)
			nums[-number]++;
		else nums[number]++;
	}
	for(int i=0;i<1001;i++){//有点问题????但是答案竟然是对的
		if(nums[i]>=2)
			sum+=nums[i]/2;
	} 
	cout<<sum;
	return 0;
} 

2. 相邻数对(20140901)

【问题描述】
  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。
输入格式
  输入的第一行包含一个整数n,表示给定整数的个数。
  第二行包含所给定的n个整数。
【输出格式】
  输出一个整数,表示值正好相差1的数对的个数。
【样例输入】
6
10 2 6 3 7 8
【样例输出】
3
【样例说明】
  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。
【评测用例规模与约定】
  1<=n<=1000,给定的整数为不超过10000的非负整数。

思路

思路如下:
(1)根据输入的n值,输入n个整数
(2)从i=0的位置开始遍历,判断与vec[i]相差为1的值是否在后面的数组中出现,出现一次则计数的变量nums++,需要注意样例中2与3是一对相邻数对,若从3开始统计时,3和2也是一对相邻数对,此时需要去重,即一定是从i+1后面的数组中去判断是否有相邻数对。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,num=0;
	cin>>n;
	vector<int> vec(n);
	for(int i=0;i<n;i++)
		cin>>vec[i];
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(vec[j]==vec[i]+1||vec[j]==vec[i]-1)//判断i后面的数组中是否有满足
											//条件的数,若存在,则计数的变量加1
				num++;
		}
	} 
	cout<<num;
	return 0;
} 

3. 门禁系统(20141201)

【问题描述】
  涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。每位读者有一个编号,每条记录用读者的编号来表示。给出读者的来访记录,请问每一条记录中的读者是第几次出现。
【输入格式】
  输入的第一行包含一个整数n,表示涛涛的记录条数。
  第二行包含n个整数,依次表示涛涛的记录中每位读者的编号。
【输出格式】
  输出一行,包含n个整数,由空格分隔,依次表示每条记录中的读者编号是第几次出现。
【样例输入】
5
1 2 1 1 3
【样例输出】
1 1 2 3 1
【评测用例规模与约定】
  1≤n≤1,000,读者的编号为不超过n的正整数。

思路

这里我还是用的桶排序的方法,已经掉进桶排序的坑了。
思路如下:
根据输入的n值输入n个正整数,并对输入的数进行桶排序,输出此时输入数字出现的次数。

实现代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,number;
	cin>>n;
	vector<int> nums(n);
	for(int i=0;i<n;i++){
		cin>>number;
		nums[number]++;
		cout<<nums[number]<<" ";
	}
	return 0;
}

笔记

你可能感兴趣的:(ccf刷题)