这一题开始的思路是定义一个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;
}