欲望以提升热忱,毅力以磨平高山!|

XichenOC

园龄:1个月粉丝:4关注:0

📂题解
🔖其他
2025-02-13 16:44阅读: 12评论: 0推荐: 0

CF2059B Cost of the Array

CF2059B Cost of the Array

题目翻译:

给定数组 \(a\) 并将他分成 \(k\) 份,并将所有偶数份连成新的数组 \(b\),找到数组 \(b\) 开销的最小值,也就是数组 \(b\) 第一个 \(i \not= b_i\) 最小。

思路:

我们先从分的第一块开始分析:我们发现若后面的 \(k-1\) 块都最小,即长度为一。那第一块,就最大到 \(n-k+2\) 处,那如果这里面存在一个数不等于 \(1\) 那我们可以很容易的将他分在 \(b\) 数组的第一位,那答案自然为 \(1\)注意: 要跳过第一位,因为 \(b\) 数组是由 \(a\) 中偶数为截取的,所以 \(b\) 中不可能有第一位)。反之如果里面全是 \(1\) 的话,就可以直接截取出两个 \(1\) 连一起,这样答案就为 \(2\) 了。

但如果 \(k=n\) 了:很明显,在这种情况下每一位为一块,那枚举所有偶数块,找到第一个 \(i\not=b_i\) 即可。

完整代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,k;
		scanf("%d%d",&n,&k);
		if(n==k){
			int num;
			bool flag=false;
			for(int i=1;i<=n;i++){
				scanf("%d",&num);
				if(!(i&1) && !flag){
					if(num!=(i>>1)){
						flag=true;
						printf("%d\n",i>>1);
						
					}
				}
			}
			if(!flag){
				printf("%d\n",(n>>1)+1);
			}
		}
		else{
			int num;
			bool flag=false;
			scanf("%d",&num);
			for(int i=2;i<=n;i++){
				scanf("%d",&num);
				if(i<=n-k+2 && !flag){
					if(num!=1){
						flag=true;
						printf("1\n");
					}
				}
			}
			if(!flag){
				printf("2\n");
			}
		}
	}
}

本文作者:XichenOC

本文链接:https://www.cnblogs.com/XichenOC/p/18713944

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   XichenOC  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起