Codeforces Round #510 (Div. 2)(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代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=2e5+; int n;
int a[maxn];
int neg,zero,pos;
int pos0[maxn];
int posNeg;//the position of the max negative number
bool vis[maxn]; void Reader()
{
scanf("%d",&n);
neg=zero=pos=;
posNeg=;
memset(vis,false,sizeof vis);
for(int i=;i <= n;++i)
{
scanf("%d",a+i);
if(a[i] > )
pos++;
else if(a[i] < )
{
neg++;
posNeg=(posNeg == || a[i] > a[posNeg] ? i:posNeg);
}
else
{
zero++;
pos0[zero]=i;
}
}
}
void Process()
{
int ope=;//操作数
if(zero != )//跳出此if语句后 zero == 0 || zero == 1
{
while(zero != )
{
printf("1 %d %d\n",pos0[zero],pos0[zero-]);
vis[pos0[zero]]=true;
zero--;
ope++;
}
}
if(ope == n-)
return ;
if(neg&)//如果负数个数为奇数个,通过去除一个值最大的奇数或乘以0来使奇数个数变为偶数
{
if(zero == )//如果存在0,则让值最大的负数乘以0
{
printf("1 %d %d\n",posNeg,pos0[]);//posNeg与pos0[1]顺序不可颠倒
ope++;
neg--;
if(ope < n-)
{
printf("2 %d\n",pos0[]);
vis[pos0[]]=true;
ope++;
}
}
if(ope == n-)
return ;
if(neg&)//如果 zero == 0,则需要通过删除值最大的负数来使负数个数变为偶数
{
printf("2 %d\n",posNeg);
neg--;
ope++;
}
vis[posNeg]=true;
}
else if(zero == && ope < n-)
{
printf("2 %d\n",pos0[]);
vis[pos0[]]=true;
ope++;
}
if(ope == n-)
return ; int num[maxn];
int index=;
for(int i=;i <= n;++i)
if(vis[i] != true)
num[++index]=i;
for(int i=;i < index;++i)
printf("1 %d %d\n",num[i],num[i+]);
}
int main()
{
Reader();
Process();
}
Codeforces Round #510 (Div. 2)(C)的更多相关文章
- Codeforces Round #510 (Div. 2)
Codeforces Round #510 (Div. 2) https://codeforces.com/contest/1042 A 二分 #include<iostream> usi ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(离散化+反向树状数组)
http://codeforces.com/contest/1042/problem/D 题意 给一个数组n个元素,求有多少个连续的子序列的和<t (1<=n<=200000,abs ...
- Codeforces Round #510 (Div. 2) B. Vitamins
B. Vitamins 题目链接:https://codeforces.com/contest/1042/problem/B 题意: 给出几种药,没种可能包含一种或多种(最多三种)维生素,现在问要吃到 ...
- Codeforces Round #510 (Div. 2) D. Petya and Array(树状数组)
D. Petya and Array 题目链接:https://codeforces.com/contest/1042/problem/D 题意: 给出n个数,问一共有多少个区间,满足区间和小于t. ...
- Codeforces Round #510 (Div. 2)(B)
传送门:Problem B https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 如果可以通过喝果汁将维生素A,B,C全部摄取,求最小花费,如 ...
- Codeforces Round #510 (Div. 2)(A)
传送门:Problem A https://www.cnblogs.com/violet-acmer/p/9682082.html 题意: 公园里有n个沙滩,a[i]表示第i个沙滩初始人数,现有m个人 ...
- codeforces 1042d//Petya and Array// Codeforces Round #510 (Div. 2)
题意:给出一个数组,求其中和小于t的区间数. 先计算前缀和数组sum[i].对当前的sum[i],查询树状数组中有几个比(sum[i]-t)大的数,那么用sum[i]减它就是一个合法区间.再将当前的s ...
- codeforces 1042c// Array Product// Codeforces Round #510(Div. 2)
题意:给出一个数组,2种操作:.1:x*y然后x消失,2:除掉x(2操作最多只能进行一次).问最大的结果的一种操作方式.逻辑题,看能不能想全面. 1先数好0,正,负的数量,zero,pos,neg.如 ...
- Codeforces Round #510 Div. 2 Virtual Participate记
这场打的顺手到不敢相信.如果不是vp的话估计肯定打不到这个成绩. A:最大显然,最小的话每次暴力给最小的+1. #include<iostream> #include<cstdio& ...
随机推荐
- 作业20171116 beta2及beta发布 成绩
申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月13日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...
- 自定义视图(SpringMVC)
一.首先理解视图的解析过程 1)请求处理方法执行完成后,最终返回一个 ModelAndView 对象. ModelAndView 对象,它包含了逻辑名(访问URL)和模型对象(javaBean数据)的 ...
- shell脚本--continue、break
shell中的continue和break和其他语言中的使用方法一模一样:continue用于跳过本次循环,break用于中断本层的循环 下面是使用例子: #!/bin/bash #文件名:test. ...
- Java 常用类的使用例子(整理)
可变字符序列——StringBuffer StringBuffer类和String类的方法几乎一样,不过StringBuffer对象表示的字符串是可以改变的,而String对象保存的字符串是不可变的. ...
- Linux&docker&cgroups
cgroup https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_manage ...
- Entity Framwork学习笔记
一.First Demo
- Sqlite,libevent,openssl,mosquito交叉编译
一.设置交叉编译环境 在makefile所在目录(或源代码根目录)打开终端. 在终端中设置交叉编译所需的临时环境变量(也可写到配置文件中设置为全局环境变量),其中交叉编译工具链的名称和目录需要根据实际 ...
- [日常工作]Oracle12cr2在日常工作中遇到的不兼容的问题
Oracle12c 数据库GS实例时需要使用新驱动,避免制单出现获取不到正确凭证编号内码的问题. Oracle12c 会产生大量的隐藏表,部分ddl语句会报错. Oracle12c 删除了VM_con ...
- [书摘]HTTPS--From图解HTTP
1. HTTP存在的安全性风险: 1) 通信过程使用明文,容易被窃听 2) 不验证通信方的身份,可能遭遇伪装 3) 不验证通信数据包的完整性,可能遭遇篡改 2. HTTP+加密+认证+完整性保护=H ...
- 删除文件,copy文件bat
由于IntelliJ IDEA Build Artifacts速度实在是无法忍受,特整理了一个bat脚本方便maven install后更新jar文件到部署包 del /F /S /Q D:\Idea ...