J 难受得一批的体验
#include<stdio.h> #include<algorithm> #include<queue> using namespace std; int a[1000005]; int s[10000005]; int main() { int t,i,j,n; scanf("%d",&t); while(t--) { priority_queue<int,vector< int>,greater<int> >q; int k; scanf("%d",&n); for(i=1;i<=(n*(n-1))/2;i++) { scanf("%d",&s[i]); } if(n<4) printf("%d\n",n-1); else { if(!q.empty()) q.pop(); q.push(s[1]+s[2]); a[1]=0; a[2]=s[1]; a[3]=s[2]; k=3; for(i=3;i<=(n*(n-1))/2;i++) { if(s[i]==q.top()&&!q.empty()) { q.pop(); } else { k=k+1; a[k]=s[i]; for(j=2;j<k;j++) { q.push(a[j]+a[k]); } } if(k>=n) break; } if(i>=(n*(n-1))/2) i=i-1; printf("%d\n",i); } } return 0; }
//优先队列 priority_queue <int,vector<int>,greater<int> > q; //注意后面两个“>”不要写在一起,“>>”是右移运算符,为从小到大输出 priority_queue <int,vector<int>,less<int> >q; //为从大到小输出 //和队列用法一样,只是在内部进行了排序ps:优先队列拿出第一个不是q.front(),而是q.top();