Codeforces Round #510 (Div. 2) C. Array Product

题目

题意:

  给你n个数,有两种操作,操作1是把第i个位置的数删去, 操作2 是把 a[ j ]= a[ i ]* a[ j ],把a[ i ]删去 。n-1个操作以后,只剩1个数,要使这个数最大 。要你输出这n-1个步骤。 

思路:

  结构体储存数和位置, 按值排序,然后分类讨论。

  1. 负数个数是奇数,无0  。删除最大的一个负数,别的数正常搞定。

  2. 负数个数是奇数,有0  。把最大的一个负数给堆积到最后一个0上,删除最后一个0 。

  3. 负数个数是偶数,无0  。 不用删,正常处理。

  4. 负数个数是偶数,有0  。 负数不理会,把0全部堆积到最后一个0上,删除最后一个0 。

  别的方法有,别人的博客里,不过这种分类讨论的方法坑实在是太多了!!

  吐血。。哭了

  1 #include<iostream>
  2 #include<cstdio>
  3 #include <cctype>
  4 #include<algorithm>
  5 #include<cstring>
  6 #include<cmath>
  7 #include<string>
  8 #include<cmath>
  9 #include<set>
 10 #include<vector>
 11 #include<stack>
 12 #include<queue>
 13 #include<map>
 14 using namespace std;
 15 #define ll long long
 16 #define mem(a,x) memset(a,x,sizeof(a))
 17 #define se second
 18 #define fi first
 19 const ll mod=1e9+7;
 20 const int INF= 0x3f3f3f3f;
 21 const int N=2e5+5;
 22 
 23 int n,p;
 24 struct node
 25 {
 26     ll pos,num;
 27 }a[N];
 28 
 29 bool cmp(node x,node y)
 30 {
 31     return x.num<y.num;
 32 }
 33 int main()
 34 {
 35     cin>>n;
 36     int cnt=0; //负数的个数 
 37     int flag0=0; //是否有0 
 38     for(int i=1;i<=n;i++)
 39     {
 40         scanf("%lld",&a[i].num);
 41         a[i].pos=i;
 42         
 43         if(a[i].num<0) cnt++;
 44         else if(a[i].num==0) flag0++;
 45     }
 46     sort(a+1,a+1+n,cmp);
 47     
 48     if(cnt%2==1 && flag0)
 49     {
 50         int k,j,p;
 51         for(int i=1;i<=n;i++)
 52         {
 53             if(a[i].num==0)
 54             {
 55                 k=i-1;
 56                 for(j=k+1;j<=n;j++)
 57                 {
 58                     if(a[j].num==0)
 59                     {
 60                         printf("1 %lld %lld
",a[j-1].pos,a[j].pos);
 61                     }
 62                     else break;
 63                 }
 64                 break;
 65             }
 66         }
 67         j--;
 68         p=j;
 69         if(k==1 && j==n) return 0;
 70         printf("2 %lld
",a[p].pos);
 71 
 72         for(int i=1;i<n;i++)
 73         {
 74             if(i+1==k)
 75             {
 76                 if(j+1<=n)
 77                     printf("1 %lld %lld
",a[i].pos,a[j+1].pos),i=j;
 78                 else break;
 79             }
 80             else if(i==k)
 81             {
 82                 if(j+2<=n)
 83                     printf("1 %lld %lld
",a[j+1].pos,a[j+2].pos),i=j+1;
 84                 else break;
 85             }
 86             else
 87                 printf("1 %lld %lld
",a[i].pos,a[i+1].pos);
 88         }
 89     }
 90     
 91     else if(cnt%2==1 && !flag0)
 92     {
 93         int k,j,p;
 94         for(int i=1;i<=n;i++)
 95         {
 96             if(a[i].num<0)
 97             {
 98                 p=i;
 99             }
100         }
101         //if(k==1 && j==n) return 0;
102         printf("2 %lld
",a[p].pos);
103 
104         for(int i=1;i<n;i++)
105         {
106             if(i+1==p)
107             {
108                 if(p+1<=n)
109                     printf("1 %lld %lld
",a[i].pos,a[p+1].pos),i=p;
110                 else break;
111             }
112             else if(i==p)
113             {
114                 if(p+2<=n)
115                     printf("1 %lld %lld
",a[p+1].pos,a[p+2].pos),i=p+1;
116                 else break;
117             }
118             else
119                 printf("1 %lld %lld
",a[i].pos,a[i+1].pos);
120         }
121     }
122     
123     else if(cnt%2==0 && flag0)
124     {
125         int k,j,p;
126         for(int i=1;i<=n;i++)
127         {
128             if(a[i].num==0 && flag0>1)
129             {
130                 k=i;
131                 for(j=k+1;j<=n;j++)
132                 {
133                     if(a[j].num==0)
134                     {
135                         printf("1 %lld %lld
",a[j-1].pos,a[j].pos);
136                     }
137                     else break;
138                 }
139                 break;
140             }
141             else if(a[i].num==0 && flag0==1)
142             {
143                 k=i;
144                 j=k+1;
145                 break;
146             }
147         }
148         j--;
149         p=j; 
150         if(k==1 && j==n) return 0;
151         printf("2 %lld
",a[p].pos);
152 
153         for(int i=1;i<n;i++)
154         {
155             if(i+1==k)
156             {
157                 if(j+1<=n)
158                     printf("1 %lld %lld
",a[i].pos,a[j+1].pos),i=j;
159                 else break;
160             }
161             else if(i==k)
162             {
163                 if(j+2<=n)
164                     printf("1 %lld %lld
",a[j+1].pos,a[j+2].pos),i=j+1;
165                 else break;
166             }
167             else
168                 printf("1 %lld %lld
",a[i].pos,a[i+1].pos);
169         }
170     }
171     
172     else if(cnt%2==0 && !flag0)
173     {
174         for(int i=1;i<n;i++)
175         {
176             printf("1 %lld %lld
",a[i].pos,a[i+1].pos);
177         }
178     }
179     
180 }
View Code
原文地址:https://www.cnblogs.com/thunder-110/p/10125566.html