Problem J: 第K完美序列

本文介绍了一种求解第K完美序列问题的算法,即给定一个仅包含1和2的序列,如何通过最少次数的修改使其变为第K完美序列。文章详细解释了算法的实现思路,并给出了AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

有一个由n个数字组成的序列,序列的每个数字不是1就是2。如果一个序列是第K完美序列,则这个序列满足以下两点;
1.k是n的因子。
2.这个序列中每隔k个元素都相等。
例如序列(1,2,1,2,1,2,1,2),不仅是一个第2完美序列而且又是一个第4完美序列。序列(1,1,1,1)是一个第1完美序列。
你的任务是给定一个由n个数字组成的序列,最少需要改变几个元素才能使这个序列变成一个第K完美序列。

Input

多组测试数据。
每组测试数据的第一行为两个正整数n,k(1<=k<=n<=100)。
第二行为n个由空格分隔的正整数代表这个序列。

Output

对于每组测试数据,输出最少需要改变的次数。

Sample Input

6 2

2 1 2 2 2 1

8 4

1 1 2 1 1 1 2 1

9 3

2 1 1 1 2 1 1 1 2

Sample Output

1 0 3

题意:

   一个由1和2组成的n长度的序列,输入k,每隔k-1个数相等就是完美序列。问需要最少改变几次才能变成完美序列

分析:

   最少改变的意思是:比如211121112.从a[0]开始隔2个数要相等,依次是a[0]=2 a[3]=1 a[6]=1.最少改变就需要改变a[0]=1.

211121112可以从a[0]开始隔两个,也可以从a[1],或a[2]开始隔两个。开始的位置可以从a【0】到a【k-1】

ac代码:

#include<stdio.h>
int a[101];
int main()
{
int m,n,i,j,k,sum;
while(scanf("%d%d",&n,&k)!=EOF)
{
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	 sum=0;
	for(j=0;j<k;j++)      //开始的位置从0到k-1 
	{
	  int c=0,z=0;
	  for(i=j;i<n;i=i+k)   //隔k个元素,遍历一遍数组 
	  {
	  	if(a[i]==1) c++;   //记录1的个数 
	   	if(a[i]==2) z++;  //记录2的个数 
	  }
	  if(c>z)             //1的个数大于2就要把不是1的改成1. 
	  {
	  	for(i=j;i<n;i=i+k)
	  	if(a[i]==2) {a[i]=1;sum++;}//sum记录改的次数 
	  }
	  if(z>=c)
	  {
	  	for(i=j;i<n;i=i+k)
	  	{
	  		if(a[i]==1) {a[i]=2;sum++;}
	  	}
	  }
	}
	if(k==0) printf("0");
	else printf("%d\n",sum);
	
}return 0;
}

 

#include<bits/stdc++.h> using namespace std; int n,k,a[10010]; int mx[10010],mn[10010],s[10010]; void pre(){ int r = log2(n); for(int i = 1; i <= r; i++) for(int j = 1; s[i] + j - 1 <= n; j++) { mx[j][i] = max(mx[j][i - 1],mx[j + s[i - 1]][i - 1]); mn[j][i] = min(mn[j][i - 1],mn[j + s[i - 1]][i - 1]); } } int f(int x,int y){ int r = log2(y - x + 1); int t1 = max(mx[x][r],mx[y - s[r] + 1][r]); return t1; } int f(int x,int y){ int r = log2(y - x + 1); int t2 = min(mn[x][r],mn[y - s[r] + 1][r]); } int main(){ ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>a[i]; } return 0; }Problem B: 最敏捷的机器人 Time Limit: 1 Sec Memory Limit: 512 MB Description Wind 设计了很多机器人。但是它们都认为自己是最强的,于是,一场比赛开始了…… 机器人们都想知道谁是最敏捷的,于是它们进行了如下一个比赛。首先,他们面前会有一排共 个,它们比赛看谁能最先把每连续 个中最大和最小值写下来,当然,这些机器人运算速度都很快,它们比赛的是谁写得快。 但是 Wind 也想知道答案,你能帮助他吗? Input 第一行为 ,意义如题目描述。 第二行共 个,为序列,所有字均在 Pascal 的 longint 范围内,即所有均为整,且在 范围内。 Output 共 行,第 行为第 至第 这 个中的最大和最小值。 Sample Input 5 3 1 2 3 4 5 Sample Output 3 1 4 2 5 3 HINT 对于全部据,。 修改使其正确
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值