link
像这种构造题可以先分类讨论一波
比如说全是正数或者全是负数,那么显然的就是可以用前缀和和后缀和来解决。
而如果有正有负呢?可以注意到的是数字非常小,而\(2^5=32>20\)了,那么我们就可以先随便找到一个正数,把他自加上5次,然后第二个数加上它2次
之后的数加上前面的数两次,这样结果一定是递加的。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<bitset>
using namespace std;
int t;
int n;
int a[30];
int po;
int ne;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
po=ne=0;
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
if(a[i]>0) po=i;
if(a[i]<0) ne=i;
}
if(po==0&&ne==0){
cout<<0<<endl;
continue;
}
if(po==0){
cout<<n-1<<endl;
for(int i=n;i>1;--i){
cout<<i-1<<" "<<i<<endl;
}
continue;
}
if(ne==0){
cout<<n-1<<endl;
for(int i=1;i<n;++i){
cout<<i+1<<" "<<i<<endl;
}
continue;
}
cout<<(n-1)*2+5<<endl;
for(int i=1;i<=5;++i){
printf("%d %d\n",po,po);
}
printf("2 %d\n2 %d\n",po,po);
for(int i=3;i<=n;++i){
printf("%d %d\n%d %d\n",i,i-1,i,i-1);
}
}
return 0;
}
标签:int,ne,Version,Easy,C1,include,po
From: https://www.cnblogs.com/For-Miku/p/17614924.html