codeforces 1144D(思维)
题意描述
You are given an array a consisting of n integers. You can perform the following operations arbitrary number of times (possibly, zero):
Choose a pair of indices (i,j) such that |i−j|=1 (indices i and j are adjacent) and set ai:=ai+|ai−aj|; Choose a pair of indices (i,j) such that |i−j|=1 (indices i and j are adjacent) and set ai:=ai−|ai−aj|. The value |x| means the absolute value of x. For example, |4|=4, |−3|=3.
Your task is to find the minimum number of operations required to obtain the array of equal elements and print the order of operations to do it.
It is guaranteed that you always can obtain the array of equal elements using such operations.
Note that after each operation each element of the current array should not exceed 1018 by absolute value.
每次进行两种操作,求将数组中的一个数变成所有数的最小次数
思路
我们发现两个操作一定能使两个相邻的数相同,所以我们找出众数,然后从左到右,从右到左遍历一遍即可。如果比众数小则需要进行第二个操作,否则进行第一个操作。
AC代码
#include<bits/stdc++.h>
#define x first
#define y second
#define PB push_back
#define mst(x,a) memset(x,a,sizeof(x))
#define all(a) begin(a),end(a)
#define rep(x,l,u) for(ll x=l;x<u;x++)
#define rrep(x,l,u) for(ll x=l;x>=u;x--)
#define IOS ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<long,long> PLL;
typedef pair<char,char> PCC;
typedef long long ll;
const int N=2*1e5+10;
const int M=1e6+10;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
int a[N];
void solve(){
map<int,int> mp;
int n;cin>>n;
rep(i,1,n+1){
cin>>a[i];
mp[a[i]]++;
}
int MAX=-1,max_val;
for(auto m : mp){
if(m.y>MAX){
MAX=m.y;
max_val=m.x;
}
}
if(MAX==n) cout<<0<<endl;
else{
cout<<n-MAX<<endl;
int idx=0;
rep(i,1,n+1){
if(a[i]==max_val){
idx=i;
break;
}
}
rrep(i,idx,1){
if(a[i]<max_val) cout<<1<<' '<<i<<' '<<i+1<<endl;
if(a[i]>max_val) cout<<2<<' '<<i<<' '<<i+1<<endl;
}
rep(i,idx,n+1){
if(a[i]>max_val) cout<<2<<' '<<i<<' '<<i-1<<endl;
if(a[i]<max_val) cout<<1<<' '<<i<<' '<<i-1<<endl;
}
}
}
int main(){
IOS;
solve();
return 0;
}
- Spring【AOP模块】就这么简单
- 【专业技术】如何写出优美的C 代码?
- StringUtils工具类常用方法
- 数据刷新中的并行改进(三) (r5笔记第79天)
- SSH【史上最详细整合】
- Github 项目推荐 | TensorFlow 项目模板架构最佳实践
- 两个死锁的实例 (r5笔记第90天)
- SSM【史上最详细整合】
- 终结 finalize()和垃圾回收(garbage collection)
- 代码+实战:TensorFlow Estimator of Deep CTR —— DeepFM/NFM/AFM/FNN/PNN
- 【SSH测试整合Demo】企业人事管理系统
- Hybris 项目工程配置
- 购物车案例【简单版】
- 再学习之MyBatis.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- GoAccess分析Web日志
- java编程思想第四版第三章要点总结
- 05 . Prometheus监控Nginx
- java编程思想第四版第五章总结
- 01 . 容器编排简介及Kubernetes核心概念
- java编程思想第四版第五章习题
- 02 . Kubeadm部署Kubernetes及简单应用
- java编程思想第四版第六章习题
- Docker部署Python项目
- 03 . 二进制部署kubernetes1.18.4
- 01 . 美团全链路监控CAT简介及部署
- 02 . Ansible高级用法(运维开发篇)
- java编程思想第四版第七章总结
- OpenVPN原理及部署使用
- 04 . Jenkins部署Java项目