牛客小白月赛112【待补】

52 阅读2分钟
题目难度知识点
A 智乃的天平签到
B 智乃爬山签到
C 智乃放球签到
D 智乃的“K”叉树★★思维

image.png

智乃的天平

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a,b,w;
int main(void)
{
    cin>>a>>b>>w;
    if((w+a==b) || (w+b==a) || (w==a) || (w==b) || (w==a+b)) puts("Yes");
    else puts("No");
    return 0;
}

智乃爬山

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],n,ans=-1;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=2;i<=n-1;i++)
    {
        if(a[i]>a[i+1]&&a[i]>a[i-1]) ans=max(ans,a[i]-((a[i-1]+a[i+1])/2));
    }
    cout<<ans;
    return 0;
}

智乃放球

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        LL n,m,k,q; cin>>n>>m>>k>>q;
        if(n%k==q%k && n>=q && m*(k-1)>=q ) puts("Yes");
        else puts("No");
    }
    return 0;
}

智乃的“K”叉树

image.png 结论好猜注意特判,一直wa麻了。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],n;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n-1;i++) 
    {
        int a,b; cin>>a>>b;
        d[a]++,d[b]++;
    }
    int maxd=0;
    for(int i=1;i<=n;i++) maxd=max(maxd,d[i]);
    int root=-1;
    for(int i=1;i<=n;i++){
        if(d[i]!=maxd)
        {
            root=i;break;
        }
    }
    if(n==2) cout<<1<<" "<<1;
    else cout<<maxd-1<<" "<<root;
}

枚举根节点,那么此时,最大的度在以下几个集合中: 1.根节点自身的度 2.除了根节点之外其他点的最大的度-1,-1是因为它不是根必有一个孩子连到了根。这里用l[N],r[N]维护除了根节点外其余点的最大值。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int d[N],l[N],r[N],n;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        int a,b; cin>>a>>b;
        d[a]++,d[b]++;
    }
    for(int i=1;i<=n;i++) l[i]=max(l[i-1],d[i]);
    for(int i=n;i>=1;i--) r[i]=max(r[i+1],d[i]);
    int k=1e9,root=0;
    for(int i=1;i<=n;i++)
    {
        int temp=max({d[i],l[i-1]-1,r[i+1]-1});
        if(temp<k) k=temp,root=i;
    }
    cout<<k<<" "<<root;
    return 0;
}