2024河南萌新联赛2024第(一)场:河南农业大学补提报告

补提数:4题(B、G、I、K)

B.爱探险的朵拉

解析:本题可以看出是一颗基环树森林,用dfs算法可以实现对题目的求解。用两个数组a,b分别存储数据,再利用b[i]的条件,和连续排列数的条件可以实现dfs循环,找出最大值。

#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010],k,res,n;
void dfs(int x,int h)
{
    b[x]=k;
    res=max(res,h);
    if(b[a[x]]!=k)
    {
        dfs(a[x],h+1);
    }
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        k++;
        if(!b[i]) dfs(i,1);
    }
    cout<<res;
}

G.旅途的终点

解析:把消耗生命最大的点用神力解决,其它按顺序

 

#include<bits/stdc++.h>
using namespace std;
int main() {
	priority_queue<long long>q;
	long long i,n,m,k,a[200005];
	scanf("%lld%lld%lld",&n,&m,&k);
	for(i=0;i<n;i++) {
		scanf("%lld",&a[i]);
		m-=a[i];
		q.push(a[i]);
		if(k&&m<=0) {
			m+=q.top();
			q.pop();
			k--;
		}
		if(m<=0) break;
	}
	printf("%lld",i);
}

I.除法移位

解析:把最大的数字移到最前面得到的结果是最大的

#include<iostream>
using namespace std;
const int N=4e5+10;
int a[N];
int main(){
int n,t;
cin>>n>>t;
for(int i=0;i<n;i++)
cin>>a[i];

int ans=a[0],sum=0;
for(int i=n-1;i>=0&&n-i<=t;i--)
if(a[i]>ans)
{
	ans=a[i];
	sum=n-i;
}

cout<<sum;
	return 0;
}

K.图上计数(Easy)

解析:两个连通块数量最接近时最大

#include<iostream>
using namespace std;
int main(){
    long long int n;
    cin>>n;
    cout<<(n/2)*(n-n/2);
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值