EOJ Monthly 2018.10B. 莫干山奇遇

EOJ Monthly 2018.10B. 莫干山奇遇

题说实话还真不难……就是没看懂23333

Time limit per test: 2.0 seconds

Memory limit: 512 megabytes

出题人当然是希望出的题目有关 oxx,于是想方设法给题目配上一些有关 oxx 的背景故事,使得它看起来不那么无趣。但有的时候却无法引入合适的小姐姐,使得 oxx 显得非常可怜。所以出题人删除了故事,只留下一个枯燥乏味的数学问题。

【故事已删除】

给一个长度为 n 的序列 a1,a2,…,an,求一个长度为 m 的序列 b1,b2,…,bm 使得:

a1,a2,…,an 是 b1,b2,…,bm 的子序列(不一定连续),且
存在常数 p>0 使得 b1,b2,…,bm 是一个 p-莫干山序列。
序列 s1,s2,…,sn 是 p-莫干山序列,当且仅当:存在 0≤x<p 对于 1≤i≤n 满足 si=(x+i)modp。

求 m 的最小值。

Input
第一行一个整数 n (1≤n≤2⋅105)。

第二行 n 个整数用空格隔开 a1,a2,…,an (0≤ai≤109)。

Output
输出最小的 m。

Examples
input
2
0 2
output
3
input
3
0 2 0
output
4
input
1
0
output
1
input
10
0 1 2 3 5 6 7 8 9 1000000000
output
1000000001
input
3
0 1 2
output
3
Note
样例 1: [0, 1, 2].

样例 2: [0, 1, 2, 0].

样例 3: [0].

官方解析:

Problem B
by ultmaster. tag: 数学、贪心

首先注意到 p 的取值应该就是 maxai+1。然后相邻两项之间贪心地填东西。答案就是

n+∑i=2n(ai−ai−1−1)modp
注意处理一下减出来的东西是负数的情况。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#define N 200100
using namespace std;
typedef long long ll;
ll n,ans=0,p=-1;
ll a[N];
int main(){
	int i;
	ll pre;
	scanf("%lld",&n);
	for(i=0;i<n;i++){
		scanf("%lld",&a[i]);
		p=max(p,a[i]);
	}
	p++;
	ans=1;
	pre=a[0];
	for(i=1;i<n;i++){
		if(pre<a[i]){
			ans+=(a[i]-pre);
		}
		else{
			ans+=(p-pre+a[i]);
		}
		pre=a[i];
	}
	printf("%lld\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值