PAT B1005 继续(3n+1)猜想

题目难度:一颗半星
题目大意:在3n+1的基础之上(不知道的看B1001的题目)给出一个数字序列,如果计算过程中出现了该数字,那么乘开始的数字覆盖过程中的数字 要求最后输出序列中 未被其他数字覆盖的数字
题目难点:在题目中,输入的是1-100 但是开数组需要开到300左右。具体的可能是因为如果输入的数字在100大小的时候,3n+1的数值会超出数组 会造成最后一个测试点的错误
代码如下:

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
bool cmp(int a,int b){
	return a<b;
}
int main(){
	int parent[300];
	memset(parent,-1,sizeof(int)*300);
	int N;
	cin>>N;
	int num[N];
	for(int i=0;i<N;i++)
		cin>>num[i];
	sort(num,num+N,cmp);
	for(int i=0;i<N;i++){
		if(parent[num[i]]==-1){
			int temp=num[i];
			while(1){
				if(temp%2==0)
					temp/=2;
				else
					temp=(3*temp+1)/2;
				if(temp!=1&&parent[temp]==-1){
					parent[temp]=1;
				}
				else
					break;
			}
		}
	}
	int flag=0;
	for(int i=N-1;i>=0;i--){
		if(parent[num[i]]==-1){
			if(flag!=0){
				cout<<" "<<num[i];
			}
			else{
				flag=1;
				cout<<num[i];
			}
		}
	}
}

你可能感兴趣的:(PAT,Basic,算法)