【codevs4696】等差数列
题目大意:给定 N 个整数组成的集合,向集合中添加一个整数,使得这 N+1 个整数组成等差数列,求这样的整数有多少个。
题解:
引理1:若原集合中只有一个元素,则有无数种可能。
引理2:若原集合中有且仅有两个整数,则最多可能有 3 种答案。
引理3:若原集合已经能够组成等差数列,则只能在序列首尾添加元素。
引理4:若原集合中的数字不能构成等差数列,且其差分序列有超过两个不相等的值,则无解。
引理5:若原集合中的数字不能构成等差数列,且其差分序列有且仅有两个相等的值,且相对较大的值有且仅有一个,且这个值是较小值的二倍时,才有且仅有一个答案。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=60;
int n,ans,tot,a[maxn],delta[maxn];
map<int,int> mp;
void read_and_parse(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1,a+n+1);
for(int i=2;i<=n;i++)delta[i]=a[i]-a[i-1];
}
bool check(){
int d=a[2]-a[1];
for(int i=3;i<=n;i++)if(a[i]-a[i-1]!=d)return 0;
return 1;
}
void solve(){
if(n==1){puts("-1");return;}
else if(n==2){
if(a[1]==a[2]){
puts("1");
printf("%d\n",a[1]);
}
else if((a[1]+a[2])%2==0){
puts("3");
printf("%d %d %d\n",2*a[1]-a[2],(a[1]+a[2])/2,2*a[2]-a[1]);
}else{
puts("2");
printf("%d %d\n",2*a[1]-a[2],2*a[2]-a[1]);
}
return;
}
else if(check()){
int d=a[2]-a[1];
if(!d){puts("1");printf("%d\n",a[1]);}
else{puts("2");printf("%d %d\n",a[1]-d,a[n]+d);}
}else{
for(int i=2;i<=n;i++)mp[delta[i]]++;
if(mp.size()>2){puts("0");return;}
map<int,int>::iterator p=mp.begin(),q=--mp.end();
if(q->second>1){puts("0");return;}
if(q->first!=p->first*2){puts("0");return;}
puts("1");
int goal=q->first;
for(int i=2;i<=n;i++)if(delta[i]==goal){
printf("%d\n",a[i]-goal/2);
break;
}
}
}
int main(){
read_and_parse();
solve();
return 0;
}
【codevs4696】等差数列的更多相关文章
- 等差数列(bzoj 3357)
Description 约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:"1,4,3,5,7" 很容易看出"1,3,5,7"是等差数列. ...
- 3357: [Usaco2004]等差数列
3357: [Usaco2004]等差数列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 321 Solved: 153[Submit][Statu ...
- Find Missing Term in Arithmetic Progression 等差数列缺失项
查找等差数列中的缺失项. e.g.Input: arr[] = {2, 4, 8, 10, 12, 14} Output: 6 Input: arr[] = {1, 6, 11, 16, 21, 31 ...
- n个整数中,找出尽可能多的数使他们组成一个等差数列,求最长等差数列的长度
例子: 3,8,4,5,6,2 返回值应该为 :5 这是昨天做的一道优酷土豆的编程题,和leetcode中的128/ Longest Consecutive Sequence 有点 ...
- 洛谷 P1147 连续自然数和 Label:等差数列
题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以从1998到2002的一个 ...
- TYVJ P1091 等差数列 Label:dp
背景 广东汕头聿怀初中 Train#3 Problem 3 描述 等差数列的定义是一个数列S,它满足了(S[i]-S[i-1]) = d (i>1).显然的一个单独的数字或者两个数字也可以形成一 ...
- 洛谷P1214 [USACO1.4]等差数列 Arithmetic Progressions
P1214 [USACO1.4]等差数列 Arithmetic Progressions• o 156通过o 463提交• 题目提供者该用户不存在• 标签USACO• 难度普及+/提高 提交 讨论 题 ...
- 51nod1055 最长等差数列
完全一脸懵逼!.dp[i][j]表示i,j为相邻的两项的最大值.两个指针两边扫的思想好劲啊这个!%%% #include<cstdio> #include<cstring> # ...
- 【USACO 1.4.3】等差数列
[题目描述] 一个等差数列是一个能表示成a, a+b, a+2b,..., a+nb (n=0,1,2,3,...)的数列. 在这个问题中a是一个非负的整数,b是正整数.写一个程序来找出在双平方数集合 ...
随机推荐
- 《基于Arm实验箱的国密算法应用》课程设计 结题报告
<基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...
- 20155321 《网络攻防》 Exp4 恶意代码分析
20155321 <网络攻防> Exp4 恶意代码分析 计划任务监控 在C盘根目录下建立一个netstatlog.bat文件(先把后缀设为txt,保存好内容后记得把后缀改为bat),内容如 ...
- ubuntu 12.04 桌面版关闭图形界面
对于12.04的ubuntu桌面系统,如果想在开机的时候直接进入字符界面,那可以: 编辑文件 /etc/init/lightdm.conf,在第12行附近,原句“ and runlevel [!06] ...
- 带阴影的圆形 QLabel
带阴影的圆形 Label 来自: 公孙二狗
- libgdx学习记录21——Box2d物理引擎之碰撞Contact、冲量Impulse、关节Joint
Box2d中,物体可以接受力(Force).冲量(Impulse)和扭矩(Torque).这些物理元素都能改变物体的运动形式,并且默认都会唤醒物体,当然只是针对动态物体. 力是一个持久的效果,通过Bo ...
- [51Nod1238]最小公倍数之和 V3[杜教筛]
题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...
- Spring+SpringMVC+MyBatis整合优化篇
优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...
- eclipse + maven + org.glassfish.jersey 创建 webapi
org.glassfish.jersey 和 com.sun.jersey 的区别是,jersy version 2 之前是 com.sun.jersy, 之后改名为 org.glassfish.je ...
- linux systemctl 命令
目录 预热 管理单个 unit 查看系统上的 unit 管理不同的操作环境(target unit) 检查 unit 之间的依赖性 相关的目录和文件 systemctl daemon-reload 子 ...
- vsftp在防火墙开启需要开放的端口
1.开放tcp端口 firewall-cmd --zone=public --add-port=20/tcp --permanent firewall-cmd --zone=public --add- ...