zoukankan      html  css  js  c++  java
  • 牛客OI周赛5-提高组

    转自:https://blog.csdn.net/qq_41157137/article/details/83721307 嘻嘻嘻

    链接:https://ac.nowcoder.com/acm/contest/226/B
    来源:牛客网
     

    题目描述

    “当你看向她时,有细碎星辰落入你的眼睛,真好。”——小可爱

    在一个繁星闪烁的夜晚,卿念和清宇一起躺在郊外的草地上,仰望星空。

    星语心愿,他们,想把这片星空的星星,连成一棵漂亮的树,将这美好的景色记录下来。

    现在,天上共有n颗星星,编号分别为1,2.....n,一开始任何两个点之间都没有边连接。

    之后,他们两个想在在(u,v)之间连无向边,需要付出|u联通块大小-v联通块大小|的代价。

    他们两个想用最少的代价来使这n个点联通,所以他们想知道最小代价是多少。

    (多组数据

    输入描述:

    第一行一个正整数,表示数据组数T
    
    接下来T行每行一个正整数,表示询问的n

    输出描述:

    T行,每行一个数表示答案

    示例1

    输入

    复制

    1
    5

    输出

    复制

    2

    说明

    1,2....5五个点,连边顺序为(1,2),(3,4),(1,5),(5,3),代价为0,0,1,1,总代价为2,是n=5的时候最优答案。
    
    虽然(1,2),(2,3),(3,4),(4,5)也可以,但是代价为0,1,2,3,总代价为6,比2大。

    备注:

    对于20%的数据,T<=2,n<=10
    
    对于40%的数据,T<=10,n<=1000
    
    对于60%的数据,T<=100000,n<=100000
    
    对于另外40%的数据,T=1,n<=1000000000000

    题解:
    加一条边可以看成两个数相加,比如:n=11,那么肯定是 5+6=11,使得代价最小为1,那5呢,也肯定是2+3=5代价最小为1,6肯定是3+3=6使得代价最小为0,T的数据比较小,递归就没有然后了。

    
    
    代码:
    /*
             11
        5          6   
     2     3    3     3
    1  1  1  2 1  2  1  2 
    */
    #include<iostream>
    using namespace std;
    typedef long long ll;
    ll result(ll n)
    {
        if(n==1) return 0;
        if(n==2) return 0;
        if(n&1)
        {
            return result(n/2)+result(n/2+1)+1; //代价为1
        }
        else return result(n/2)*2; //代价为0
    }
    int main()
    {
        int t;
        ll n;
        cin>>t;
        while(t--)
        {
            cin>>n;
            cout<<result(n)<<endl;
        }
        return 0;
    }
     
    
  • 相关阅读:
    rac11.2.0.4私网公网修改
    OGG应用复制进程报错OGG 01161
    顺序容器vector拷贝使用总结
    C++迭代器(STL迭代器)
    C++容器(STL容器)
    win10桌面和手机的扩展API,判断是否有实体后退键API
    python Django 之 Model ORM inspectdb(数据库表反向生成)
    flask框架-大结局
    flask框架-下
    flask框架-中
  • 原文地址:https://www.cnblogs.com/UUUUh/p/10284071.html
Copyright © 2011-2022 走看看