Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round 4) ABCD

A

Right-Left Cipher

standard input/output

1 s, 256 MB
Submit Add to favourites  x5307
B

Div Times Mod

standard input/output

1 s, 256 MB
Submit Add to favourites  x4423
C

Connect Three

standard input/output

1 s, 256 MB
Submit Add to favourites  x2468
D

Minimum Diameter Tree

standard input/output

1 s, 256 MB
Submit Add to favourites  x1987

 

A:開個雙端隊列模擬

B: 解方程

     ,已經n,k,求x最小值,注意這個div是整除,所以可以化簡一下,先設y = x % k,

∴ (x - y) / k * y = n,x = n / y * k + y,注意。。。。這裏要先除k,因爲這個除法也是整除,你n * k  / y != n / y * k ,自己傻逼在這兒debug了半個小時多 沒發現,枚舉y就可以了

C:給三個點,求覆蓋的最小塊數

強行判斷確實很麻煩,可以考慮排序,按x,在按y,所以直接放pair裏,sor一下,對於最遠的距離,構造一條邊,然後從這個邊,往另外兩個點連線構造就可以了

D: 一顆樹,一個權值s,你可以對這棵樹賦值邊權,但是要所有邊權和等於s,求任意兩個點之間的權值的最大值的最小值,任意兩點的距離最大值,要求最小,我們就要儘量的把s分出去,但是你會發現無論你怎麼分邊權,如果不在葉子節點上增加權值,那這個最小值就會越來越大,均分葉子節點的邊後,就會發現,無論怎麼增加減少,都會使得這個值變大,所以在葉子邊權上纔是最優的,直接求葉子節點個數,平分 * 2 就可以了。

代碼:

int main()
{
    ios;
    while(cin >> n >> k) {
        ll ans = 1e18;
        for(ll i = 1; i <= k - 1; i++) {
            if(n % i == 0){
                ans = min(ans,n / i * (k) + i);
            }
        }
        wt(ans);
    }
    return 0;
}

P p[30];
int main() {
    for(int i=1; i<= 3; i++)cin>> p[i].fi >> p[i].se;
    sort(1 + p,p + 4);
    set<P>s;
    s.insert(p[1]);
    s.insert(p[2]);
    s.insert(p[3]);
    int Min1 = min(min(p[1].se,p[2].se),p[3].se);
    int Min2 = max(max(p[1].se,p[2].se),p[3].se);
//    cout << Min1 << "  " << Min2 << endl;
    for(int i = Min1;i <= Min2;i++){
//        if(i == p[1].fi) continue;
        s.insert(P(p[2].fi,i));
    }
//    cout << s.size() << endl;
    for(int i = p[1].fi;i <= p[2].fi;i++){
//        s.insert(P(p[1].fi,i));
        s.insert(P(i,p[1].se));
    }
    for(int i = p[2].fi;i <= p[3].fi;i++){
        s.insert(P(i,p[3].se));
//        s.insert(P(p[3].fi,i));
    }
    cout << s.size() << endl;
    for(auto d:s){
        cout << d.fi << " " << d.se << endl;
    }


}

vector<int>v[maxn];
void dfs(int x,int fa){
    if(v[x].size() == 1) ans++;
    for(auto d:v[x]){
        if(d == fa) continue;
        dfs(d,x);
    }
}
int main()
{
    ios;
    double s ;
    while(cin >> n >> s){
            ans = 0;
        for(int i = 1;i < n;i++){
            int x,y;
            cin >> x >> y;
            v[x].pb(y);
            v[y].pb(x);
        }
        dfs(1,0);
//        wt(ans);
        s /= ans;
        wt(s * 2,6);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章