HDU – 4811 – Ball (思維)

somliy發表於2018-09-26

題意:

給出一定數量的三種顏色的球,計算如何擺放得到值最大(有一定順序)
有三種擺放方法
1、如果放的是第一個(桌子上原來沒有),數值不變
2、如果在末尾追加一個,那麼增加前面不同顏色的個數的值
3、如果在兩個之間放置,那麼增加兩邊不同顏色的個數的值

思路:

b藍 r紅 y黃
三種擺放方法可以理解為兩種,2和3歸為一種。
尋求最大值的話,一定是每次在中間放置球,這樣得到的值更大

首先,如果每個球大於2個的話,就是說可以拿出部分球擺成以下這樣情況
brybry,兩邊都有3種顏色,剩下的球全部放在yb之間,每次增加6

那麼只需要計算 (總數-6)* 6 + 擺放6個時得到的分數
若有顏色不到2個,那麼一開始兩邊擺的球的顏色數就會減少
設此時兩邊的顏色總數和為a,那麼後面每個加入的球放中間都能得到a分

ans=(總的球數-先擺的球數)*a+b(b為先擺的過程中所獲得的得分)

那麼b怎麼計算呢,在擺放最開始幾個球的時候,會發現是一個等差數列,1,2,3…
所以我們直接用等差數列求和就可以得出b的值了
b=(0+先擺的球數-1)*先擺的球數/2

#include<iostream>

using namespace std;

typedef long long ll;

ll deal(ll x) {
    return x > 2 ? 2 : x;
}

int main() {
    ll a, b, c;
    while (~scanf("%lld %lld %lld", &a, &b, &c)) {
        ll index = deal(a) + deal(b) + deal(c);
        ll sum = a + b + c - index;
        ll ans = sum * index + index * (index - 1) / 2;
        printf("%lld
", ans);
    }
    return 0;
}

相關文章