UVA Prime Sequence

这一题开始的思路是定义一个vector record(10005,0),用下标保存序列长度,值保存为序列的末尾元素下标,发现通过定义两个变量minLen和minMark(subscript)分别保存最短长度和序列末尾元素的下标可以节约空间和代码量。

#include <cstdio>
#include <iostream>
#include <cctype>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <list>
#include <iterator>
#include <cmath>
using namespace std;
vector<bool> noprime(1000005,false);
vector<int> num(1000005,0);
void init(){//初始化素数表 
		//vector<int> prime;
    noprime[0]=true;
	noprime[1]=true;	
	for(int i=2;i<=1000005;i++){
		if(!noprime[i]){
			//prime.push_back(i);
		for(int j=2;j*i<=1000005;j++){
			noprime[j*i]=true;
		}
	}
 }
}

int main(){
	init();
	int t;
	scanf("%d",&t);
	while(t--){
		int n,minLen=1000005,minMark=0;//使用minLen,minMark两个变量大大的减少了空间 minMark->subscript
		vector<int> vec;//保存输入序列 
		//vector<int> rec(10005,0);//a trick,rec[i]=j:length of i ends with submark j; 
		scanf("%d",&n);
		while(n--){
			int temp;
			scanf("%d",&temp);
			vec.push_back(temp);
		}
		for(int i=1;i<vec.size();i++){
			int sum=vec[i];
			for(int j=i-1;j>=0;j--){
				sum+=vec[j];
				if(!noprime[sum]&&(i-j+1<minLen)){
					minLen=i-j+1;
					minMark=i;
				}
			}
		}
		if(minMark==0){
			printf("This sequence is anti-primed.\n");
			continue;
		}
		printf("Shortest primed subsequence is length %d:",minLen);
		for(int j=minMark-minLen+1;j<=minMark;j++){
			printf(" %d",vec[j]);
		}
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/86742459
今日推荐