2 5 1 2 3 4 5 4 4 4 4 4
4 -1
//++ 史上第一坑,我都开始质疑我的编程习惯了,注释的部分是 wa了 30多次的代码 //将宏定义 改成直接调用algorithm库里面的函数直接就对了。。。。之前的有道题 //同样的代码使用了宏定义,这样更节省了时间,果断AC,于是当时决定使用宏定义, //看来我该好好反省一下自己的人生了! #include<stdio.h> #include<string.h> #include<stdlib.h> //#define min(a,b) a>b?b:a #include<algorithm> using namespace std; #define inf 0xfffffff int a[2000200]; int map[1100][1100],dis[1100],visit[1100],b[1100]; int n; void f() { int i,j; a[1]=1,a[0]=1; for(i=2;i*i<=2000000;i++) { if(!a[i]) { for(j=i*i;j<=2000000;j+=i) { a[j]=1; } } } } void prime() { int i,j,pos=1,min,sum=0;//此处的sum可定义为__int64 位的 避免超出 但是这道题数据很水 ,上面判定素数的时候定义到100万就能AC memset(visit,0,sizeof(visit)); for(i=1;i<=n;++i) { dis[i]=map[1][i]; } visit[1]=1; for(i=1;i<n;++i) { min=inf; for(j=1;j<=n;++j) { if(!visit[j]&&dis[j]<min) { pos=j; min=dis[j]; } } if(min==inf) { printf("-1\n"); return ; } visit[pos]=1; sum+=min; for(j=1;j<=n;++j) { if(!visit[j]&&dis[j]>map[pos][j]) { dis[j]=map[pos][j]; } } } printf("%d\n",sum); } int main() { int t; int i,j; scanf("%d",&t); f(); while(t--) { scanf("%d",&n); for(i=1;i<=n;++i) { scanf("%d",&b[i]); } for(i=1;i<=n;++i) { for(j=1;j<=n;++j) { if(i==j) map[i][j]=0; else map[i][j]=inf; } } for(i=1;i<=n;++i) { for(j=i+1;j<=n;++j) { if( (!(a[b[i]])) || !a[b[j]] || !a[b[i]+b[j]]) { int minx=min(min(b[i],b[j]),abs(b[i]-b[j])); if(minx<map[i][j]) map[i][j]=map[j][i]=minx; } } } prime(); } return 0; }
原文地址:http://blog.csdn.net/ice_alone/article/details/44779239