zoukankan      html  css  js  c++  java
  • 考试题 : 游戏 (二分,贪心)

    Code

    #include<bits/stdc++.h>
    #define N 2000008
    using namespace std;
    
    struct sj{
        int to,next;
    }a[N*2];
    int size,head[N],n,k;
    
    void in(int &x)
    {
        char ch=getchar();int f=1,w=0;
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
        x=f*w; return;
    }
    
    void add(int x,int y)
    {
        a[++size].to=y;
        a[size].next=head[x];
        head[x]=size;
    }
    
    int dep[N],dst[N],st,res;
    void dfs(int fr,int x)
    {
        dst[x]=dep[x]=dep[fr]+1; 
        int lm,rm;
        lm=0; rm=19260817;
        int ljs=0,rjs=0;
        for(int i=head[x];i;i=a[i].next)
        {
            int tt=a[i].to;
            if(tt==fr)continue;
            dfs(x,tt);
            if(dst[tt]-dep[x]>(st/2))
                rm=min(rm,dst[tt]-dep[x]),rjs++;
            else 
                lm=max(lm,dst[tt]-dep[x]),ljs++;
        }
        if(rm+lm>st)
            res-=rjs,dst[x]=dep[x]+lm;
        else 
            res-=(rjs-1),dst[x]=dep[x]+rm;
        return;
    }
    
    bool judge()
    {
        dfs(-1,1);
        return (res>=0);    
    }
    
    int main()
    {
    	freopen("game.in","r",stdin);
    	freopen("game.out","w",stdout);
        in(n),in(k);
        for(int i=1;i<n;i++)
        {
            int x,y; 
            in(x),in(y);
            add(x,y);add(y,x);
        }
        int l=0,r=n,ans=n*2;
        while(l<=r)
        {
            int mid=(l+r)/2; st=mid; res=k;
            if(judge())r=mid-1,ans=min(ans,mid);
            else l=mid+1;
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    snmp简介
    PKI简介
    小程序收藏
    mysql数据库中同一DB内倒表指令
    核心层+汇聚层+接入层
    eng
    rmon简介
    几个常用的JavaScript字符串处理函数
    C# 特性(Attribute)学习 关于 .net中[]的解释
    C#操作Excel文件(读取Excel,写入Excel)
  • 原文地址:https://www.cnblogs.com/Kv-Stalin/p/11245245.html
Copyright © 2011-2022 走看看