最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

CodeforcesRound#241(Div.2)D

来源:动视网 责编:小采 时间:2020-11-09 07:39:06
文档

CodeforcesRound#241(Div.2)D

CodeforcesRound#241(Div.2)D:题目链接:D. Population Size 题意:一些数字,要求分块,使得每一块都是等差数列,但是有些数字是-1,代表任意数字(但是要大于0),问最少需要分几块。 思路:贪心。每次找到相邻两个确定数字,并且记录下第一个数字前有多少个-1,就能确定出公差,然后利
推荐度:
导读CodeforcesRound#241(Div.2)D:题目链接:D. Population Size 题意:一些数字,要求分块,使得每一块都是等差数列,但是有些数字是-1,代表任意数字(但是要大于0),问最少需要分几块。 思路:贪心。每次找到相邻两个确定数字,并且记录下第一个数字前有多少个-1,就能确定出公差,然后利


题目链接:D. Population Size 题意:一些数字,要求分块,使得每一块都是等差数列,但是有些数字是-1,代表任意数字(但是要大于0),问最少需要分几块。 思路:贪心。每次找到相邻两个确定数字,并且记录下第一个数字前有多少个-1,就能确定出公差,然后利

题目链接:D. Population Size


题意:一些数字,要求分块,使得每一块都是等差数列,但是有些数字是-1,代表任意数字(但是要大于0),问最少需要分几块。

思路:贪心。每次找到相邻两个确定数字,并且记录下第一个数字前有多少个-1,就能确定出公差,然后利用公差去判断前面的-1能不能填进去,如果不能ans就多1,然后从第二个确定数字位置开始找,如果可以,就利用公差一直找到能放的最后一个位置,然后下次从那个位置开始找。

细节比较多,代码挫挫的:

#include 
#include 

const int N = 200005;
__int64 n, i, j;
__int64 a[N];

int main() {
	__int64 ans = 0;
	scanf("%I64d", &n);
	for (i = 0; i < n; i++)
	scanf("%I64d", &a[i]);
	i = 0;
	__int64 s1 = 0;
	while (i < n) {
	s1 = 0;
	while (a[i] == -1 && i < n) {
	s1++;
	i++;
	}
	__int64 s = i;
	if (i < n)
	i++;
	while (a[i] == -1 && i < n) {
	i++;
	}
	if (i == n) {
	ans++;
	break;
	}
	__int64 e = i, d;
	if ((a[e] - a[s]) % (e - s) == 0) {
	d = (a[e] - a[s]) / (e - s);
	}
	else {
	ans++;
	continue;
	}
	if (d > 0 && s1 > (a[s] - 1) / d) {
	ans++;
	i = e;
	continue;
	}
	__int64 sum = a[s];
	for (j = s + 1; j < n; j++) {
	sum += d;
	if (sum < 1) {
	i = j;
	ans++;
	break;
	}
	if (a[j] != -1 && sum != a[j]) {
	i = j;
	ans++;
	break;
	}
	}
	if (j == n) {
	i = n;
	ans++;
	}
	}
	printf("%I64d\n", ans);
	return 0;
}

文档

CodeforcesRound#241(Div.2)D

CodeforcesRound#241(Div.2)D:题目链接:D. Population Size 题意:一些数字,要求分块,使得每一块都是等差数列,但是有些数字是-1,代表任意数字(但是要大于0),问最少需要分几块。 思路:贪心。每次找到相邻两个确定数字,并且记录下第一个数字前有多少个-1,就能确定出公差,然后利
推荐度:
标签: 题目 round Codeforces
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top