Codeforces Round #547 (Div. 3) C. Polycarp Restores Permutation(思维)
时间:2022-06-19
本文章向大家介绍Codeforces Round #547 (Div. 3) C. Polycarp Restores Permutation(思维),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://codeforces.com/contest/1141/problem/C
题意是有一个数组p,为1-n的一个排列,现在有一个q数组,使得每一位qi = pi+1 - pi,现在给出了q数组,让你还原出p数组,如果还原不出p数组输出-1
有两种方法,一种是推出一个关于p1的公式,一种是求一下偏移量。首先说一下求偏移量的方法,我们先令p1为1,然后构造出一个数组,然后找出这个数组中的最小值。因为原p数组应是1-n的排列,所以最小值应该是1,如果不是1的话就会有一个偏移量,然后我们将每个数都加上这个偏移量,然后再看这个数组是否合法就好了。
另一种方法是我们对于q数组求前缀和,可以得到s数组,因为qi = pi+1 - pi,所以可以推出si = pi+1 - p1,又因为p1+p2+p3+p4+...+pn = n * (n + 1) / 2,所以可以得到一个关于p1的式子,(n-1)p1 = p2 + p3 + ... + pn - s1 - s2 - ... - sn-1,就可以求出p1的值了,从而推出整个数组,然后再判断是否合法即可。
AC代码(偏移量):
#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
int n;
int pre[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d",&pre[i]);
}
int a[maxn];
a[1] = 1;
int ans = 0x3f3f3f3f;
for(int i=1;i<n;i++){
a[i + 1] = a[i] + pre[i];
ans = min(ans, a[i + 1]);
}
ans = min(ans, 1);
int xx = 1 - ans;
map<int,int> ma;
for(int i=1;i<=n;i++){
a[i] += xx;
ma[a[i]] ++;
}
for(int i=1;i<=n;i++){
if(ma[i] != 1){
puts("-1");
return 0;
}
}
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
AC代码(公式):
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
ll pre[200005],s[200005],a[200005];
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%lld",&pre[i]);
}
ll ans = 0;
for(int i=1;i<n;i++){
s[i] = pre[i] + s[i-1];
ans += s[i];
}
map<int,int> ma;
a[1] = (ll)n * (ll)(n + 1) / 2 - ans; // 这里会爆int
a[1] /= n;
ma[a[1]] ++;
for(int i=1;i<n;i++){
a[i + 1] = a[i] + pre[i];
ma[a[i+1]] ++;
}
for(int i=1;i<=n;i++){
if(ma[i] != 1){
puts("-1");
return 0;
}
}
for(int i=1;i<=n;i++){
printf("%lld ",a[i]);
}
return 0;
}
- 总结了一些指针易出错的常见问题(六)
- spring-data-mongodb之MongoTemplate 修改数据
- spring-data-mongodb之MongoTemplate 添加数据
- Cannot create a session after the response has been committed
- spring-data-mongodb之环境准备(1)
- java8 Lambda尝尝鲜
- spring-data-mongodb之批量更新操作
- spring-data-mongodb之Aggregation
- spring-data-mongodb之gridfs
- spring-data-mongodb之自增ID实现
- spring-data-mongodb之Repositor操作数据
- mongodb java操作语法
- spring-data-mongodb之查询操作
- spring mvc开发的mongodb网页版客户端
- 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 数组属性和方法
- 分布式一致性协议 - Paxos
- 链表中穿针引线
- Android 帧动画的实例详解
- Android HandlerThread使用方法详解
- LeetCode 167,两数之和2
- 详解android 通过uri获取bitmap图片并压缩
- android线程消息机制之Handler详解
- 分布式一致性协议 - ZAB
- 删除链表的倒数第N个节点
- Open3d学习计划—高级篇 2(彩色点云配准)
- Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法
- 有效的括号
- Android PopupWindow实现左侧弹窗效果
- LeetCode. 209. 长度最小的子数组
- 一篇文章就能了解Rxjava