题目描述

You are given an array aa consisting of nn integers. You can perform the following operations with it:

  1. Choose some positions ii and jj ( 1 \le i, j \le n, i \ne j1≤i,j≤n,i≠j ), write the value of a_i \cdot a_jai​⋅aj​ into the jj -th cell and remove the number from the ii -th cell;
  2. Choose some position ii and remove the number from the ii -th cell (this operation can be performed no more than once and at any point of time, not necessarily in the beginning).

The number of elements decreases by one after each operation. However, the indexing of positions stays the same. Deleted numbers can't be used in the later operations.

Your task is to perform exactly n - 1n−1 operations with the array in such a way that the only number that remains in the array is maximum possible. This number can be rather large, so instead of printing it you need to print any sequence of operations which leads to this maximum number. Read the output format to understand what exactly you need to print.

题目大意:

有n个数,组成一个数列,我们可以进行两种操作:

1 l r

表示 r=l∗r,同时删去l

2 w

表示删掉w这个位置的数(只能使用一次)

现在,你可以进行n−1次操作,并要求你在进行n−1次操作后使剩下的最后一个数最大。操作不会改变数字的序号(也就是删除一个数后后面的不会前移)。因为答案可能很大,我们不用输出最终结果,只需输出任意一种方案

思路:

贪心题。。

我们知道一点,任何一个0乘进来都没有什么用

因为任何一个数乘0都是0,一定不会最优

所以0是废物

同时负数呢?

负负得正

所以我们可以留下偶数个负数

如果负数是奇数个,那么很遗憾,为了不让最终结果是负数,必须要舍弃一个

乘积最大,所以要舍弃的,就是绝对值最小的那个

然后我们把要舍弃的先合并再舍弃

为什么呢?

比如说序列长为n,我的序列里全是0

如果你一个一个地删除,你就得删n次

而如果你两两合并呢?

答案是0,的确是最优情况了

Ok,不过细节不少,大家要多多注意

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
using namespace std;
int n,a[],cnt,bj[],wz,zero[],minx=,bnt;
int main()
{
scanf("%d",&n);
for(rii=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==)
{
bnt++;
zero[bnt]=i;
bj[i]=;
}
if(a[i]<)
{
cnt++;
if(-*a[i]<minx)
{
minx=-*a[i];
wz=i;
}
}
}
if(cnt%==)
{
bj[wz]=;
bnt++;
zero[bnt]=wz;
}
sort(zero+,zero+bnt+);
int pre=zero[];
for(rii=;i<=bnt;i++)
{
printf("1 %d %d\n",pre,zero[i]);
pre=zero[i];
}
if(bnt!=n&&bnt!=)
{
printf("2 %d\n",pre);
}
for(rii=;i<=n;i++)
{
if(bj[i]!=)
{
pre=i;
break;
}
}
for(rii=pre+;i<=n;i++)
{
if(bj[i]==)
{
printf("1 %d %d\n",pre,i);
pre=i;
}
}
}

CF1042C Array Product(贪心,模拟)的更多相关文章

  1. CF1042C Array Product 分类讨论+贪心

    考虑有无负数(负数的个数为奇视作“有”,否则为“无”)和有无零 无负数无零,全部合并即可 无负数有零,那么把零合并起来,删掉零 有负数无零,把最大的负数找出来,删掉,合并剩余的数 有负数有零,把零和最 ...

  2. CodeForces ---596B--Wilbur and Array(贪心模拟)

    Wilbur and Array Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Su ...

  3. Array Product(模拟)

    Array Product http://codeforces.com/problemset/problem/1042/C You are given an array aa consisting o ...

  4. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

  5. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  6. CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)

    链接: https://vjudge.net/problem/CodeForces-721D 题意: Recently Maxim has found an array of n integers, ...

  7. UVA 10714 Ants 蚂蚁 贪心+模拟 水题

    题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...

  8. CodeForces 797C Minimal string:贪心+模拟

    题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...

  9. CodeForces - 730A 贪心+模拟

    贪心策略: 1.只有一个最大值,选着第二大的一起参加比赛减分. 2.有奇数个最大值,选择三个进行比赛. 3.偶数个最大值,选择两个进行比赛. 为什么不把最大值全部选择? 因为最多只能选五个,有可能选择 ...

随机推荐

  1. C# ADO.NET面向对象想法

    我认为的面向对象就是把各种问题拆分开来 逐一解决,  我想的是先是数据库,到底有什么, 然后新建一个类,类里面先是private的私有的,但是可以有无数个可以连接private的pubilc的属性 可 ...

  2. 【转】sqlserver字符串拆分(split)方法汇总

    Java..net等开发工具具有split功能,最近在Sqlserver中碰到这个需求. 方法1:动态SQL法 ),) set @string='1,2,3,4,5,6,7,8,9,10' set @ ...

  3. 51nod 1597 有限背包计数问题 (背包 分块)

    题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下 ...

  4. shell 重启 tomcat 脚本

    #!/bin/sh # author hapday -- export TOMCAT_HOME=/usr/local/tomcat-pms tomcat_pid=$(ps -ef | grep ${T ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:发布具有同步能力的FeatureService服务

    1.前言 从ArcGIS 10.2.1开始推出离在线一体化技术之后,数据的离在线一体化编辑一直是大家所关注的一个热点.数据存储在企业级地理数据库中,通过ArcGIS桌面软件加载后配图处理,并发布到Ar ...

  6. bit_count

    bit_count函数的含义 用来计算二进制数中包含1的个数. select BIT_COUNT(10); 因为10转成二进制是1010,所以该结果就是2. bit_or函数的含义 就是对两个二进制数 ...

  7. spring security基于数据库表进行认证

    我们从研究org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl.class的源码开始 public class JdbcDaoI ...

  8. tomcat、Apache服务器外网无法访问80和8080端口,其他端口可以访问

    tomcat.Apache服务器外网无法访问80和8080端口,其他端口都可以访问,很明显地看出这是网络运营商的问题,他们把80和8080端口对外访问屏蔽了. 解释:这两个端口是常用的HTTP协议端口 ...

  9. 《O2O实战:二维码全渠道营销》读书笔记思维导图(530KB)

  10. 人多qiu是好

    小组第一次冲刺 团队任务描述: 在确定完分组,并对于敏捷开发做了相应的了解之后,我们团队开始了第一次的冲刺.对于我们团队的第一次的Scrum冲刺,我们团队开展了团队会议.首先,我们明确了我们的目标,对 ...