题面

传送门

分析

思路简单,但代码较复杂的贪心

分类讨论:

  • 有0

    • 负数有奇数个:将绝对值最小(实际最大)的负数和0全部乘到一起,最后删掉0
    • 负数有偶数个:将0全部乘到一起,最后删掉0
  • 没有0
    • 负数有奇数个:将绝对值最小(实际最大)的负数删掉
    • 负数有偶数个:不删

      最后把剩下的数依次乘在一起即可

代码


#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define maxn 200005
#define INF 0x7fffffff
using namespace std;
int n;
long long a[maxn];
struct oper {
int type;
int i;
int j;
oper() { }
oper(int x,int y,int z) {
type=x;
i=y;
j=z;
}
void print() {
if(type==1) {
printf("%d %d %d\n",type,i,j);
} else {
printf("%d %d\n",type,i);
}
}
};
vector<int>zeros;
vector<oper>res;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%I64d",&a[i]);
}
int cntneg=0,cnt0=0;
long long maxneg=-INF;
int del=0;
for(int i=1; i<=n; i++) {
if(a[i]==0) {
zeros.push_back(i);//记录0的位置
cnt0++;
} else if(a[i]<0) {
cntneg++;
if(a[i]>maxneg) {
maxneg=a[i];
del=i;//记录最大的负数的位置
}
}
}
for(int i=0;i<cnt0-1;i++){
res.push_back(oper(1,zeros[i],zeros[i+1]));//将0全部挪到一起
}
if(cntneg%2==1){//分类讨论
if(cnt0!=0) res.push_back(oper(1,del,zeros[cnt0-1])),res.push_back(oper(2,zeros[cnt0-1],0));
else res.push_back(oper(2,del,0));
}else if(cnt0!=0) res.push_back(oper(2,zeros[cnt0-1],0));
int last=0;
for(int i=1; i<=n; i++) {
if(a[i]!=0) {
if(cntneg%2==1&&i==del) continue;
else if(last==0) {
last=i;
continue;
} else res.push_back(oper(1,last,i));
last=i;
}
}
for(int i=0; i<n-1; i++) {
res[i].print();
}
}

Codeforces 1042C (贪心+模拟)的更多相关文章

  1. CodeForces - 730A 贪心+模拟

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

  2. Population Size CodeForces - 416D (贪心,模拟)

    大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...

  3. Arthur and Questions CodeForces - 518E (贪心模拟)

    大意: 给定序列$a$, 某些位置为'?', 求给'?'赋值使得序列$(a_1+a_2+...+a_k,a_2+a_3+...+a_{k+1},...)严格递增, 且$\sum|a_i|$最小. 化简 ...

  4. Sums of Digits CodeForces - 509C (贪心,模拟)

    大意: 一个未知严格递增数组$a$, 给定每个数的数位和, 求$a[n]$最小的数组$a$ #include <iostream> #include <algorithm> # ...

  5. Music in Car CodeForces - 746F (贪心,模拟)

    大意: n首歌, 第$i$首歌时间$t_i$, 播放完获得贡献$a_i$, 最多播放k分钟, 可以任选一首歌开始按顺序播放, 最多选w首歌半曲播放(花费时间上取整), 求贡献最大值. 挺简单的一个题, ...

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

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

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

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

  8. 贪心+模拟 ZOJ 3829 Known Notation

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

  9. Largest Beautiful Number CodeForces - 946E (贪心)

    大意: 定义一个好数为位数为偶数, 且各位数字重排后可以为回文, 对于每个询问, 求小于$x$的最大好数. 假设$x$有$n$位, 若$n$为奇数, 答案显然为$n-1$个9. 若为偶数, 我们想让答 ...

随机推荐

  1. Spring Boot日志处理

    2.4 日志处理 2.4.1 记录日志内容 请求url 访问者ip 调用方法classMethod 参数args 返回内容 2.4.2 新建包aspect,新建日志切面处理类 package com. ...

  2. MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结

    一 MySQL总体架构 上图是<高性能MySQL>中对MySQL总体架构的描述,客户端对服务端的连接有很多条,有一个专门的处理组件,类似tomcat使用线程池处理请求.解析器负责解析sql ...

  3. QQ输入法用户评价

    1.用户界面 用户界面简洁,并且可以随用户喜好自己更换,人性化,优化性比较大 2.记住用户选择 当输入一个字时,下一次输入这个拼音第一位的字就是上一次,或者使用次数最多的字.假如所使用的的字在后边,输 ...

  4. windows 10安装python3和python2

    安装包下载: 安装包下载请点我 下载完安装包就可以开始安装了,下面是流程图! Python3.6安装流程: 选择自定义安装: 直接next 为电脑上的所有用户安装 然后install就ok了! 安装完 ...

  5. 039:模版结构优化之include标签详解

    引入模版: 有时候一些代码是在许多模版中都用到的.如果我们每次都重复的去拷贝代码那肯定不符合项目的规范.一般我们可以把这些重复性的代码抽取出来,就类似于Python中的函数一样,以后想要使用这些代码的 ...

  6. React Native 之ScrollView

    import React, { Component } from 'react' import { Text, StyleSheet, View, Button ,TouchableOpacity,A ...

  7. mysql FOREIGN KEY约束 语法

    mysql FOREIGN KEY约束 语法 作用:一个表中的 FOREIGN KEY 指向另一个表中的 PRIMARY KEY. DD马达 说明:FOREIGN KEY 约束用于预防破坏表之间连接的 ...

  8. CF543B Destroying Roads 枚举 + 思维 + BFS

    Code: #include <bits/stdc++.h> #define ll long long #define setIO(s) freopen(s".in", ...

  9. sh_01_hello

    sh_01_hello print("hello python") print("你好世界")

  10. 蒙特卡洛(Monte Carlo)方法求面积

    如图,刷微博时,看到一个问题,第一个想到的就是用蒙特卡洛方法求解,当时正在练python,于是尝试用python编写程序. import random # 先求s1 k=0 n=100000000 f ...