补提数: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);
}