2021“MINIEYE杯”中国大学生算法设计超级联赛(6)Median

本文详细解析了2021年'MINIEYE杯'中国大学生算法设计超级联赛中关于杭电7029 Median问题的解决方案,包括关键思路和AC代码展示。

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

杭电7029 Median
在这里插入图片描述
AC代码:

#include<bits/stdc++.h>
const int  N= 1e5+10;
using namespace std;
#define ll long long
ll a[N],b[N];
int main(){
   int T;
   cin>>T;
   while(T--){
        ll num=0,n,m;
        cin>>n>>m;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=0;i<m;i++)cin>>a[i];
        sort(a,a+m);
        //把第一段放进去 图中红色下划线 
        b[num++]=a[0]-1;
        //再把第二段到第m-1段放进去 图中绿色下划线 
        for(int i=1;i<m;i++)b[num++]=a[i]-a[i-1]-1;
        //最后把最后一段放进去 图中紫色下划线 
		b[num++]=n-a[m-1];
        ll maxnum=0,sum=0,pos=0;
        for(int i=0;i<num;i++){
        	sum+=b[i];
        	if(b[i]>maxnum){
        		maxnum=b[i];
        		pos=i;
			}
		}
		//长度最大的段的数字个数不大于其它段的数字个数之和,一定可以
		if(maxnum<=sum-maxnum)cout<<"YES"<<endl;
		else{
			//长度最大的段的数字个数大于其它段的数字个数之和,则要看该段前面有多少个b[i](最大段前b[i]的个数即pos) 
			//b[i]个数大于等于配对后剩下的数字个数,则可行(即pos>=manum)
			ll tmp=maxnum-(sum-maxnum);
			if(pos>=tmp)cout<<"YES"<<endl;
			else cout<<"NO"<<endl;
		}
    }
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值