题目链接
https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776
输入:
6
3 5 6 7 8 11
输出:
7 6
思路:
1、用数组arr下标来标记输入的数字,如果这个数字是重复验证过的 ,那么就将其数组的值修改为1作为记号
2、使用向量vector来表示输入的每个值,利用向量可以定位到数据的地址
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
Arr[i] | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|
|
|
| V(1) |
| V(2) | V(3) | V(4) | V(5) |
|
| V(6) |
|
|
|
|
|
V(1) |
| 1 | 1 | 0 | 1 | 1 |
|
| 1 |
|
|
|
|
|
|
|
|
V(2) |
|
|
|
|
| pass |
|
|
|
|
|
|
|
|
|
|
|
V(3) |
|
|
| 1 |
| pass | 0 |
|
|
|
|
|
|
|
|
|
|
V(4) |
|
|
|
|
|
|
| 0 |
|
|
| 1...... |
|
|
|
|
|
V(5) |
|
|
|
|
|
|
|
| pass |
|
|
|
|
|
|
|
|
V(6) |
|
|
|
|
|
|
|
|
|
|
| pass |
|
|
|
|
|
3、简单来说最后输出的结果就是arr中,这几个数组的地址可以用向量来寻址,然后没有修改为1的就是在这组数据中没有被覆盖的数
4、使用sort(v.begin(),v.end(),cmp)函数实现从大到小排序 cmp(int a,int b){return a>b};
4、最后使用一个标记flag来帮助让输出第一个数后,每个后面的数,输出的时候都要先输出一个空格。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int cmp(int a,int b){
return a>b;//从大到小排序
}
int main(){
int K;
int arr[100]={0};//初始化数组
int i=0;
int n;
int flag=0;
cin>>K;
vector<int> v(K);//定义向量,长度是K
for(i=0;i<K;i++){
cin>>n;
v[i] = n;
while(n!=1){
if(n%2!=0)
n=n*3+1;
n = n/2;
if(arr[n]==1) break;
arr[n] = 1;
}
}
sort(v.begin(),v.end(),cmp);
for(i=0;i<v.size();i++){
if(arr[v[i]]==0){
if(flag==1)
cout<<" ";//保证一开始不输出空格
cout<<v[i];
flag = 1;
}
}
return 0;
}