codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)
题意:给出一个数组,2种操作:。1:x*y然后x消失,2:除掉x(2操作最多只能进行一次)。问最大的结果的一种操作方式。
逻辑题,看能不能想全面。
1先数好0,正,负的数量,zero,pos,neg。如果0数量不为0,在所有0的内部用操作1减少到只剩1个0,zero置1;(删去0不影响结果,如果结果是0,那么剩1个0也能做到,如果结果不是0,那么删0是必须的)
2负数有奇数个时(这种情况下一定有非负解)(1)如果zero=0,用操作2删掉最大的负数(不删结果负,删了必为正)(2)zero=1,用0和最大的负数乘。如果pos!=0或者neg!=1,再用操作2删去0;
3负数有0个时:如果有正数且zero=1,用操作2删去0;没正数结果只能为0(即给的数列全是0)
4负数
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> #include <list> using namespace std; const int SZ=1000010,INF=0x7FFFFFFF; typedef long long lon; const double EPS=1e-9; bool isneg(int x) { return x<0; } bool ispos(int x) { return x>0; } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n; cin>>n; vector<int> vct(n); for(int i=0;i<n;++i) { cin>>vct[i]; } int negnum=count_if(vct.begin(),vct.end(),isneg); int zeronum=count(vct.begin(),vct.end(),0); int posnum=n-negnum-zeronum; //if(vct[0]==582204189 )cout<<negnum<<" "<<zeronum<<" "<<posnum<<endl; if(zeronum>1) { int last=-1; for(int i=0;i<n;++i) { if(vct[i]==0) { if(last!=-1) { cout<<1<<" "<<last+1<<" "<<i+1<<endl; vct[last]=-INF; } last=i; } } } if(negnum&1) { if(zeronum==0) { int maxv=-INF,maxid=0; for(int i=0;i<n;++i) { if(vct[i]<0&&vct[i]>maxv) { maxv=vct[i]; maxid=i; } } cout<<2<<" "<<maxid+1<<endl; vct[maxid]=-INF; } else { int maxv=-INF,maxid=0; for(int i=0;i<n;++i) { if(vct[i]<0&&vct[i]>maxv) { maxv=vct[i]; maxid=i; } } int pos=find(vct.begin(),vct.end(),0)-vct.begin(); cout<<1<<" "<<maxid+1<<" "<<pos+1<<endl; if(posnum||negnum!=1)cout<<2<<" "<<pos+1<<endl; vct[maxid]=-INF; vct[pos]=-INF; } } else if(negnum==0) { if(posnum&&zeronum) { int pos=find(vct.begin(),vct.end(),0)-vct.begin(); cout<<2<<" "<<pos+1<<endl; vct[pos]=-INF; } } else if(zeronum) { int pos=find(vct.begin(),vct.end(),0)-vct.begin(); cout<<2<<" "<<pos+1<<endl; vct[pos]=-INF; } int last=-1; for(int i=0;i<n;++i) { if(vct[i]!=-INF) { if(last==-1)last=i; else { cout<<1<<" "<<last+1<<" "<<i+1<<endl; last=i; } } } return 0; }
为其它偶数时(至少为2,一定有正数解),如果zero=1删去1
上面删的数用数组记录,最后没删的数用操作1乘起来。