题意: 长度为n的Array A和B ,要求构造n/2+1个下标,使suma*2 > tota && sumb*2 > totb
思路:两种算法, 玄学随机orz !!!!!!!!!!!! 正规算法贪心
思路:
①.玄学随机
random_shuffle 暴力前n/2+1个 。 不可描述的玄学,暴力美学? ????
以后是不是碰到类似数组满足某种要求的都可以暴力美学(๑•̀ㅂ•́)و✧!
②.正规贪心
1.对于A数组按a[i]递减排序
2.把a[1]选定
3.如果n是奇数,那么n-1是偶数,选一半,对于连续的两个数a[i],a[i+1],A任意选一个都可以,对B来说,选b[i]和b[i+1]中最大的就可以构造出答案。
4.偶数同上,先选第一个和最后一个,剩下n-2个选一半
///提供2份AC代码 ///贪心 #include<bits/stdc++.h> #define PI acos(-1.0) #define pb push_back using namespace std; typedef long long ll; const int N=1e5+5; const int MOD=1e9+7; const int INF=0x3f3f3f3f; struct node{ int a,b,index; }p[N]; bool cmp(node t1,node t2){ return t1.a>t2.a; } int main(void){ int n;cin>>n; for(int i=1;i<=n;i++) scanf("%d",&p[i].a),p[i].index=i; for(int i=1;i<=n;i++) scanf("%d",&p[i].b); sort(p+1,p+1+n,cmp); cout << n/2+1<<endl; if(n%2==1){ printf("%d ",p[1].index); for(int i=2;i<=n;i+=2){ // printf("i=%d\n",i); if(p[i].b>=p[i+1].b) printf("%d ",p[i].index); else if(p[i].b<p[i+1].b) printf("%d ",p[i+1].index); } } else if(n%2==0){ printf("%d ",p[1].index); printf("%d ",p[n].index); for(int i=2;i<=n-1;i+=2){ if(p[i].b>=p[i+1].b) printf("%d ",p[i].index); else if(p[i].b<p[i+1].b) printf("%d ",p[i+1].index); } } return 0; } ///玄学随机 #include<bits/stdc++.h> #define PI acos(-1.0) #define pb push_back using namespace std; typedef long long ll; const int N=1e5+5; const int MOD=1e9+7; const int INF=0x3f3f3f3f; int n; ll tota,totb; struct node{ int a,b,index; }p[N]; bool check(){ ll suma=0,sumb=0; for(int i=1;i<=n/2+1;i++){ suma+=1ll*p[i].a; sumb+=1ll*p[i].b; if(suma*2>tota &&sumb*2>totb ) return true; } return false; } int main(void){ cin>>n; for(int i=1;i<=n;i++) scanf("%d",&p[i].a),p[i].index=i,tota+=p[i].a; for(int i=1;i<=n;i++) scanf("%d",&p[i].b),totb+=p[i].b; cout << n/2+1 <<endl; while(!check()){ random_shuffle(p+1,p+1+n); } for(int i=1;i<=n/2+1;i++) printf("%d ",p[i].index); puts(""); return 0; }