CF1042C Array Product(贪心,模拟)
题目描述
You are given an array aa consisting of nn integers. You can perform the following operations with it:
- 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;
- 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(贪心,模拟)的更多相关文章
- CF1042C Array Product 分类讨论+贪心
考虑有无负数(负数的个数为奇视作“有”,否则为“无”)和有无零 无负数无零,全部合并即可 无负数有零,那么把零合并起来,删掉零 有负数无零,把最大的负数找出来,删掉,合并剩余的数 有负数有零,把零和最 ...
- CodeForces ---596B--Wilbur and Array(贪心模拟)
Wilbur and Array Time Limit: 2000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Su ...
- Array Product(模拟)
Array Product http://codeforces.com/problemset/problem/1042/C You are given an array aa consisting o ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
- 贪心+模拟 ZOJ 3829 Known Notation
题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...
- CodeForces-721D-Maxim and Array(优先队列,贪心,分类讨论)
链接: https://vjudge.net/problem/CodeForces-721D 题意: Recently Maxim has found an array of n integers, ...
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...
- CodeForces 797C Minimal string:贪心+模拟
题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...
- CodeForces - 730A 贪心+模拟
贪心策略: 1.只有一个最大值,选着第二大的一起参加比赛减分. 2.有奇数个最大值,选择三个进行比赛. 3.偶数个最大值,选择两个进行比赛. 为什么不把最大值全部选择? 因为最多只能选五个,有可能选择 ...
随机推荐
- Mac下抓包工具Charles4.0下载及使用
Charles是一款运行在你自己计算机上的web代理工具,可以有效地获取http通信信息,主要用于网页的开发和调试等. 安装 以下为来自史蒂芬周的博客的Charles 4.0 Mac破解版 下载地址: ...
- Objective C 中的BOOL, bool, Boolean理解
一. 1.类型不同 BOOL为int型 bool为布尔型 2.长度不同 bool只有一个字节 BOOL长度视实际环境来定,一般可认为是4个字节 3.取值不同 bool取值false和true,是0和1 ...
- ezdpl Linux自动化部署实战
最近把ezdpl在生产环境中实施了,再加上这段时间的一些修改,一并介绍一下. 再次申明: ezdpl不是开箱即用的,需要根据自己的应用环境定制.对初学者来说使用起来反倒困难更多.风险更大. 它不是一个 ...
- 【Linux】Linux远程登陆
登录任务 Windows主机--远程登录--Linux主机 一.登陆前提准备 1.1 确保网络通畅 确保从Windows 能够Ping通Linux 1.2 关闭Linux防火墙 //前提:以root管 ...
- Oracle 数据库异机恢复(归档模式)
操作必须在服务器上进行(在192.168.12.71上执行) 0.按需要恢复的日期,把距恢复日期最近的全部备份和全部备份日期后的日志备份一同拷贝到需要恢复的机器上: 1.用RMAN登陆 C:\User ...
- day01-struts框架
一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2 ...
- 深度搜索C语言伪代码
bool DFS(Node n, int d){ if (d == 4){//路径长度为返回true,表示此次搜索有解 return true; } for (Node nextNode in n){ ...
- xml linq
这里讲解一下linq对xml的基本操作,包括: 新建xml.新建节点 查询节点 插入属性.插入节点 替换节点 在这里我封装了一些常用的方法: public class XmlHelper { /// ...
- 好记性不如烂笔头-nginx安装环境与Linux安装ftp组件
Nginx安装环境 1. Nginx安装环境 Nginx是C语言开发,建议在linux上运行,我参加工作这些年来一直使用Linux发行版之一的 Centos作为安装环境. 1.1 gcc 安装Ngin ...
- supersocket 通过配置文件启动服务 总是 初始化失败的 解决办法
<serverTypes> <add name="APPServerType" type="TMPServer.APP.APPServer, TMPSe ...