传送门:Problem C

https://www.cnblogs.com/violet-acmer/p/9682082.html

题意:

  给你n个数,定义有两种操作

  ① 1 i j : (i != j) 将a[i]从数列中移除,且a[j] <- a[i]*a[j]

  ② 2 i : 将a[i]从数列中移除,此操作最多使用一次

  注意:将数移除后剩余数的编号并未改变,依旧为初始时的输入顺序

  在经过n-1次操作后使剩余的数最大

题解:

  使用操作②的情况:

  (1) : 数列中含有0

  (2) : 负数个数为奇数个

  n-1个操作的最终结果为负数个数为偶数个,数列中没有0元素(当然除去全是0元素这一情况)

踩坑:

  如果此数列中有负数为奇数个,且含有0元素

  处理方法:

  (1)先将所有0元素通过操作①使其个数变为一个;

  (2)在通过操作①用最大的负数乘以0,去除一个负数两两相乘后对结果贡献最小的负数,使负数个数为偶数个;

  (3)通过②操作去除0元素

AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn=2e5+;
  6.  
  7. int n;
  8. int a[maxn];
  9. int neg,zero,pos;
  10. int pos0[maxn];
  11. int posNeg;//the position of the max negative number
  12. bool vis[maxn];
  13.  
  14. void Reader()
  15. {
  16. scanf("%d",&n);
  17. neg=zero=pos=;
  18. posNeg=;
  19. memset(vis,false,sizeof vis);
  20. for(int i=;i <= n;++i)
  21. {
  22. scanf("%d",a+i);
  23. if(a[i] > )
  24. pos++;
  25. else if(a[i] < )
  26. {
  27. neg++;
  28. posNeg=(posNeg == || a[i] > a[posNeg] ? i:posNeg);
  29. }
  30. else
  31. {
  32. zero++;
  33. pos0[zero]=i;
  34. }
  35. }
  36. }
  37. void Process()
  38. {
  39. int ope=;//操作数
  40. if(zero != )//跳出此if语句后 zero == 0 || zero == 1
  41. {
  42. while(zero != )
  43. {
  44. printf("1 %d %d\n",pos0[zero],pos0[zero-]);
  45. vis[pos0[zero]]=true;
  46. zero--;
  47. ope++;
  48. }
  49. }
  50. if(ope == n-)
  51. return ;
  52. if(neg&)//如果负数个数为奇数个,通过去除一个值最大的奇数或乘以0来使奇数个数变为偶数
  53. {
  54. if(zero == )//如果存在0,则让值最大的负数乘以0
  55. {
  56. printf("1 %d %d\n",posNeg,pos0[]);//posNeg与pos0[1]顺序不可颠倒
  57. ope++;
  58. neg--;
  59. if(ope < n-)
  60. {
  61. printf("2 %d\n",pos0[]);
  62. vis[pos0[]]=true;
  63. ope++;
  64. }
  65. }
  66. if(ope == n-)
  67. return ;
  68. if(neg&)//如果 zero == 0,则需要通过删除值最大的负数来使负数个数变为偶数
  69. {
  70. printf("2 %d\n",posNeg);
  71. neg--;
  72. ope++;
  73. }
  74. vis[posNeg]=true;
  75. }
  76. else if(zero == && ope < n-)
  77. {
  78. printf("2 %d\n",pos0[]);
  79. vis[pos0[]]=true;
  80. ope++;
  81. }
  82. if(ope == n-)
  83. return ;
  84.  
  85. int num[maxn];
  86. int index=;
  87. for(int i=;i <= n;++i)
  88. if(vis[i] != true)
  89. num[++index]=i;
  90. for(int i=;i < index;++i)
  91. printf("1 %d %d\n",num[i],num[i+]);
  92. }
  93. int main()
  94. {
  95. Reader();
  96. Process();
  97. }

Codeforces Round #510 (Div. 2)(C)的更多相关文章

  1. Codeforces Round #510 (Div. 2)

    Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...

  2. Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)

    http://codeforces.com/contest/1042/problem/D 题意 给一个数组n个元素,求有多少个连续的子序列的和<t (1<=n<=200000,abs ...

  3. Codeforces Round #510 (Div. 2) B. Vitamins

    B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...

  4. Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)

    D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...

  5. Codeforces Round #510 (Div. 2)(B)

    传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如 ...

  6. Codeforces Round #510 (Div. 2)(A)

    传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 公园里有n个沙滩,a[i]表示第i个沙滩初始人数,现有m个人 ...

  7. codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)

    题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...

  8. codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)

    题意:给出一个数组,2种操作:.1:x*y然后x消失,2:除掉x(2操作最多只能进行一次).问最大的结果的一种操作方式.逻辑题,看能不能想全面. 1先数好0,正,负的数量,zero,pos,neg.如 ...

  9. Codeforces Round #510 Div. 2 Virtual Participate记

    这场打的顺手到不敢相信.如果不是vp的话估计肯定打不到这个成绩. A:最大显然,最小的话每次暴力给最小的+1. #include<iostream> #include<cstdio& ...

随机推荐

  1. linux下expect环境安装以及简单脚本测试

    expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装 下 ...

  2. linux 第七周 总结及实验

    姬梦馨 原创作品 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linux内核如何装载和启动一 ...

  3. HttpServletResponse类学习

    /*//2) 乱码的解决. //设置服务器输出的编码为UTF-8---在BaseServlet处已经已经进行了设置 response.setCharacterEncoding("UTF-8& ...

  4. JavaScript中给onclick绑定事件后return false遇到的问题

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JVM EXCEPTION_ACCESS_VIOLATION

    ## A fatal error has been detected by the Java Runtime Environment:## EXCEPTION_ACCESS_VIOLATION (0x ...

  6. multer处理post请求的代码演示

    let express = require('express'); let multer = require('multer'); let mObj = multer({dest:__dirname+ ...

  7. Jquery ajax ajaxStart()和ajaxStop()加载前的优雅表现

    Jquery中当一个Ajax请求启动时,并且没有其他未完成的Ajax请求时,将调用ajaxStart()方法.同样,ajaxStop()方法则是在所有Ajax请求都完成时调用.这些方法的参数都是一个函 ...

  8. python有序字典

    最近的django开发中用到了有序字典,所以研究了一下,以下. 示例: 有序字典和通常字典类似,只是它可以记录元素插入其中的顺序,而一般字典是会以任意的顺序迭代的. 普通字典: d1={} d1['a ...

  9. link & auto cards

    link & auto cards a link to card link https://docs.embed.ly/docs/cards DD WX <blockquote clas ...

  10. Tomcat7/8访问Server Status、Manager App、Host Manager出现403 forbidden

    在配置好Tomcat7/8后,我们往往需要访问Tomcat7/8的Manager以及Host Manager.就需要在tomcat-users.xml中配置用户角色来实现.在地址栏输入:localho ...