题目链接:Codeforces 382C Arithmetic Progression
题目大意:给出一个长度为n的序列,表示有n张卡片,上面的数字,现在还有一张卡片,上面没有数字,问说可以写几种数字在这张卡片上面,使得n+1张卡片上的数字可以排列成一个等差数列,有无限多种时输出-1.
解题思路:分类,n为1、2、3、3+,四种,注意相同的数字算一种。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
const int N = 100005;
int n, a[N];
struct state {
int k, v;
};
void init () {
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a + n);
}
void solve () {
set<int> ans;
if (n == 2) {
int d = a[1] - a[0];
ans.insert(a[0]-d); ans.insert(a[1]+d);
if (d % 2 == 0) ans.insert(a[1]-d/2);
} else if (n == 3) {
int d1 = a[1] - a[0], d2 = a[2] - a[1];
if (d1 == d2) { ans.insert(a[0]-d1); ans.insert(a[2]+d1); }
else {
if (d1 == d2 * 2) {
ans.insert(a[0] + d2);
} else if (d2 == d1 * 2) {
ans.insert(a[1] + d1);
}
}
} else {
int cnt = 0, d[10];
map<int, int> g;
for (int i = 1; i < n; i++) {
int k = a[i] - a[i-1];
g[k]++;
if (g[k] == 1) {
d[cnt++] = k;
if (cnt >= 3) break;
}
}
if (cnt == 1) {
ans.insert(a[0]-d[0]); ans.insert(a[n-1]+d[0]);
} else if (cnt == 2 && g[d[0]] == 1 && d[0] == 2 * d[1]) {
for (int i = 1; i < n; i++) if (a[i] - a[i-1] == d[0]) {
ans.insert(a[i]-d[1]); break;
}
} else if (cnt == 2 && g[d[1]] == 1 && d[1] == 2 * d[0]) {
for (int i = 1; i < n; i++) if (a[i] - a[i-1] == d[1]) {
ans.insert(a[i]-d[0]); break;
}
}
}
bool flag = false;
printf("%lu\n", ans.size());
for (set<int>::iterator i = ans.begin(); i != ans.end(); i++) {
if (flag) printf(" ");
printf("%d", *i); flag = true;
}
if (ans.size()) printf("\n");
}
int main () {
init();
if (n == 1) printf("-1\n");
else solve();
return 0;
}
分享到:
相关推荐
解决问题(문제해결) ACM-ICPC凭证,BOJ,CodeForces,Codewars,SCPC,摇动,TopCoder凭证
codeforces每日一练。 题意: 给定n个点,m条有向边,以及k时间。求不超过k时间1-n最多能经过多少个点。 思路: 数据<=5000,说明是个暴力dp。 那么可以用dp[i][j]维护从1到i点经过了j个点,然后初始化为inf,再设...
codeForces C ++中的Code Force解决方案
波兰球和游戏: ://codeforces.com/problemset/problem/755/B 问题779 B.怪异的舍入: : 问题845 A.国际象棋锦标赛: : 问题884 B.日语填字游戏反击: : 问题985 A.国际象棋的放置: : 问题1042 A.长凳: : 问题1105...
Codeforces 题库 101-200 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
打codeforces的神器
268C Beautiful Sets of Points 传送门 题意:在n*m的格点图里尽量多的选点,使点之间两两距离不为整数,同时不能选(0,0). 构造水题了,很明显每行/列最多放一个,那么最多应该放min(n,m)+1个,由于0,0不能选,直接...
Codeforces 题库 001-100 共~500题 codeforces.com版权所有。 程序可提交至该网站评测。
codeforces编程网站预测分数插件
暴枚最长桌脚的长度$l$,然后长度比$l$长的桌脚全部都要砍掉长度比$l$短的桌脚选择代价前$k$小的砍掉用线段树维护;示例程序 :typedef long l
编码 C ++中的Codeforce问题的解决方案
Codeforces Round #620 (Div. 2) [codeforces 1304A] Two Rabbits 整除+模 总目录详见https://blog.csdn.net/mrcrack/article/details/103564004 在线测评地址https://codeforces.ml/contest/1304/problem/A ...
# sublime-plugin-for-codeforces 自定义构建,用于从 codeforces 获取测试用例并检查程序是否正确。 平台:GNU/Linux 语言:Python2.7.9 描述:这个程序从 codeforces 中获取测试用例,并告诉你程序的输出是否与...
使用于Google Chrome的Codeforces Enhancer 1.1.2插件安装包。 版本:codeforces enhancer 1.1.2 使用浏览器:Google Chrome
Codeforces扩展包 是否曾经想让Codeforce拥有方便的快捷键,自动更新排行榜,可以按需隐藏/显示的问题标签,更好的站点导航,深色主题或以上所有功能? 这些和更多功能可以在Codeforces ++中获得! 该扩展是开源的,...
Codeforces 185A - Plant 全测试点49个
codeforces 19 E Fairy 一道比较难的题目的解题报告 推荐阅读
Codeforces global round 10 codes
Codeforces round 678 division 2 codes
Some of the Codeforces problems codes