网站大量收购独家精品文档,联系QQ:2885784924

8、小蓝的零花钱.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

解题思路

首先,我们可以将题目中的序列看成偶数和奇数的交错序列。我们可以用变量?sumsum?记录当前序列中偶数和奇数的个数之差,当?sumsum?等于?00?时,说明当前位置可以进行一次操作,因为此时序列可以被分成两段,且每个段中奇数和偶数的个数相等。

对于每次操作,我们需要计算其代价。我们可以将两个相邻操作之间的元素放在一起,这样得到的新序列中奇数和偶数的个数之差依然为?00。那么我们可以计算相邻两次操作之间的元素差的绝对值,从中选取代价最小的一次操作执行。

接下来,我们可以将每个可操作的位置看成一个区间。假设共有?mm?个可操作的位置,对这?mm?个区间按照代价从小到大排序,然后从小到大枚举每个区间,如果当前的预算?BB?足够进行这个区间的操作,那么就执行这个操作,并将答案?ansans?加?11,同时减去操作的代价?cnt_icnti。如果?BB?不足以进行这个区间的操作,那么就结束枚举,输出答案?ansans。

时间复杂度为?O(n\logn)O(nlogn),其中?\lognlogn?为排序的时间复杂度。

AC_Code

C++

#includebits/stdc++.h

usingnamespacestd;

constintN=1e5+10;

intn,a[N],cnt[N];

signedmain()

{

intn,B;

cinnB;

for(inti=1;i=n;i++)cina[i];

intsum=0,now=0;

for(inti=1;i=n;i++){

if(a[i]1)sum++;

elsesum--;

if(sum==0i+1=n)

cnt[++now]=abs(a[i+1]-a[i]);

}

sort(cnt+1,cnt+1+now);

intans=0;

for(inti=1;i=now;i++){

if(B=cnt[i])B-=cnt[i],ans++;

elsebreak;

}

coutans\n;

return0;

}

Java

importjava.util.*;

publicclassMain{

publicstaticvoidmain(String[]args){

Scannerscan=newScanner(System.in);

intn=scan.nextInt();

intB=scan.nextInt();

int[]a=newint[n+1];

for(inti=1;i=n;i++)a[i]=scan.nextInt();

intsum=0,now=0;

int[]cnt=newint[n+1];

for(inti=1;i=n;i++){

if(a[i]%2==1)sum++;

elsesum--;

if(sum==0i+1=n)cnt[++now]=Math.abs(a[i+1]-a[i]);

}

Arrays.sort(cnt,1,now+1);

intans=0;

for(inti=1;i=now;i++){

if(B=cnt[i]){

B-=cnt[i];

ans++;

}elsebreak;

}

System.out.println(ans);

}

}

Python

n,B=map(int,input().split())

a=list(map(int,input().split()))

sum=0

cnt=[]#记录每个区间的代价

foriinrange(n):

ifa[i]1:

文档评论(0)

如此醉 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档