序列改变 (分析题)
来源:互联网 发布:唐国强演技怎么样知乎 编辑:程序博客网 时间:2024/06/16 09:30
给定一个序列 {a1 a2 a3 a4 a5......},判断是否存在一个数 val 使得对于任意一个数 ai 经过+val,-val的操作,或不进行操作后(即每次操作结束后 对应ai可能会变为ai+val,ai-val,ai中的一种)使得序列中的每一个数相等
若存在这个数 val 则输出YES 否则输出 NO。
input
第一行为一个数n (1<=n<1e5)
第二行为序列中的数ai (1<=ai<1e9)
output
输出一行
若存在val 则输出“YES”
否则输出 “NO”
Sample in
5
1 3 3 1 2
Sample out
YES
思路: 刚开始看到这个题 还以为是二分答案 o(nlogn) 1000ms 应该能过。码代码的时候 看到样例突然想明白了,并不需要二分,只要理解这个val是个定值就可以了。
1.假设存在val 那么序列中相同的数 只需执行相同的操作就可以了。
2.去重升序排序后 思考,对于每个数只进行3种操作中的一种 则可以推出每种操作最多只能有一个数(如果不是一个数 并且不存在重复 则两个数进行相同操作后的结果一定不同) 所以就可以理解为小学数学题 把一队人分成至多3队 要求每队中至多只有一个人。
问题就解决了
附代码
#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <map>#include <set>#include <vector>#include <queue>#include <stack>#include <math.h>using namespace std;int main(){ int n,k; scanf("%d",&n); set<int> num; set<int>::iterator p; for(int i=0;i<n;i++)/* 对于题意的要求 去重+排序 set很方便*/ { scanf("%d",&k); num.insert(k); } int have=num.size(); if(have>3) printf("NO\n"); else if(have<3) /* 序列中数少于两个 必然可以满足题意*/ printf("YES\n"); else { int div[4]; int i=0; for(p=num.begin();p!=num.end();p++,i++) div[i]=*p; if(div[2]-(div[1]-div[0])==div[1]) printf("YES\n"); else printf("NO\n"); } return 0;}
1 0
- 序列改变 (分析题)
- java字符串-改变序列
- 时间序列分析(一)
- 最长连续子序列长度(最多改变一个数)
- oracle取得序列当前值(不改变当前序列值)
- hdu2371 矩阵乘法(求序列位置改变m次后的序列)
- Java序列化的几种方式以及序列化的作用(文章有所改变)
- Excel-时间序列图(趋势)分析
- 对 Java Serializable(序列化)分析
- 时序分析:ARMA方法(平稳序列)
- 时间序列分析笔记(待整理)
- 时间序列分析之预处理(一)
- 时间序列(五)股票分析
- JAVA序列化基础知识Serializable与Externalizable的区别(改变默认的序列化/反序列化行为)
- 数据分析-时间序列分析
- 核酸序列分析
- 核酸序列分析
- UML序列图分析
- 计算机系统结构第一节课
- git常用命令
- vue教程
- JAVA基础知识小结_小知识点
- SystemInfo获取系统参数
- 序列改变 (分析题)
- iOS开发之仿射变换示例总结
- Spring Security 4.2.2 一些注意事项
- 大数据学习入门
- 装饰模式与代理模式的区别
- This application's application-identifier entitlement does not match that of the installed applicat
- pat 甲1125. Chain the Ropes (贪心)
- c语言基于炫彩界面库音乐播放器
- ubuntu14.04安装 openssh-sever 出现下列依赖错误