zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    CompletableFuture组合式异步编程
    java日志:slf4j
    Protobuffer生成java类
    变量快速变camel写法
    上海有线通下载exe会302转发请求
    ClickOnce添加自定义prerequisite
    International Conference for Smart Health 2015 Call for Papers
    IEEE/ACM ASONAM 2014 Industry Track Call for Papers
    Call for Papers IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM)
    Call for Papers International Conference for Smart Health (ICSH) 2014
  • 原文地址:https://www.cnblogs.com/thunder-110/p/10125566.html
Copyright © 2011-2022 走看看