KickStart 2019 Round H題解

H-index

題目鏈接

題目大意

計(jì)算學(xué)術(shù)H指數(shù)咖祭。如果一個(gè)人有x篇論文各自被引用至少x次,那么最大可能的x即為它的H指數(shù)呕屎。

思路

優(yōu)化求h指數(shù)過(guò)程,最初intuitive solution只想到了二分查找合適的x,而求解x的過(guò)程并沒(méi)有優(yōu)化。實(shí)際很簡(jiǎn)單:通過(guò)樹(shù)狀數(shù)組維護(hù)大于x的總數(shù)。

代碼

#include <vector>
#include <iostream>

using namespace std;

int N, M, tmp;
int MAXN = 1e5+10;
vector<int> a (MAXN+1);

void update(int data, int idx) {
    while (idx <= MAXN) {
        a[idx] += data;
        idx += -idx & idx;
    }
}

int query(int idx) {
    int res = 0;
    while (idx) {
        res += a[idx];
        idx -= -idx & idx;
    }
    return res;
}

int bisearch(int idx) {
    int l = 0, r = MAXN-1;
    while (l < r) {
        int mid = l + (r-l) / 2, cnt = idx + 1 - query(mid-1);
        if (cnt >= mid) l = mid + 1;
        else r = mid;
    }
    return l-1;
}

int main(int argc, const char * argv[]) {
    cin >> N;
    for (int kase = 1; kase <= N; ++kase) {
        cin >> M;
        cout << "Case #" << kase << ":";
        fill(begin(a), end(a), 0);
        for (int i = 0; i < M; ++i) {
            cin >> tmp;
            update(1, tmp);
            cout << " " << bisearch(i);
        }
        cout << endl;
    }
    return 0;
}

Diagonal Puzzle

題目鏈接

題目大意

翻牌游戲,每次翻一個(gè)斜線晌砾,求最少經(jīng)過(guò)多少步可以把棋盤(pán)里的格子翻為黑色。

思路

感覺(jué)這道題比較難烦磁,一道DFS題目养匈,但需要一些數(shù)據(jù)預(yù)處理:

  1. 把每個(gè)格子所處的正反斜線標(biāo)號(hào)哼勇,使得每條斜線上的格子編號(hào)一致,如下圖所示呕乎,對(duì)于n=3的情況积担,有此編號(hào):


    排序示例
  2. 由上圖不難看出,每個(gè)格子都是正反斜線的焦點(diǎn)猬仁,故用數(shù)組G維護(hù)其相交線的編號(hào)及焦點(diǎn)是否為黑色帝璧。
  3. DFS每個(gè)焦點(diǎn),決定是否翻當(dāng)前這個(gè)斜線的牌湿刽。由于一定有解的烁,且整個(gè)DFS的策略只與是否翻第一個(gè)牌有關(guān),故我們用cnt數(shù)組記錄 所到交點(diǎn)的翻/不翻的次數(shù)诈闺,兩者交換即為另一種情況(即是否翻第一個(gè)牌)渴庆。

代碼

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int T, N;
const int MAXN = 500;
vector<string> mat (101, "");
vector<bool> vis (MAXN, false);
vector<vector<pair<int, bool>>> G (MAXN, vector<pair<int, bool>> ());
vector<int> cnt (2, 0); // 0: step for not change, 1: step for change

void dfs(int idx, bool changed) {
    vis[idx] = true;
    cnt[changed]++;
    for (auto& pir: G[idx]) {
        if (!vis[pir.first])
            dfs(pir.first, pir.second ^ changed);
    }
}

int main(int argc, const char * argv[]) {
    cin >> T;
    for (int kase = 1; kase <= T; ++kase) {
        cin >> N;
        for (int i = 0; i < N; ++i)
            cin >> mat[i];

        for_each(G.begin(), G.end(), [](auto& pirs) { pirs.clear(); });
        fill(vis.begin(), vis.end(), false);

        for (int i = 0; i < N; ++i) {
            for (int j = 0; j < N; ++j) {
                int lidx = i + j, ridx = N + (N+i-1) + (N-j-1);
                G[lidx].emplace_back(ridx, mat[i][j] == '.');
                G[ridx].emplace_back(lidx, mat[i][j] == '.');
            }
        }

        int pircnt = 2 * (2 * N - 1), res = 0;
        for (int i = 0; i < pircnt; ++i) {
            if (!vis[i]) {
                cnt[0] = cnt[1] = 0;
                dfs(i, false);
                res += min(cnt[0], cnt[1]);
            }
        }
        cout << "Case #" << kase << ": " << res << endl;
    }

    return 0;
}

Elevanagram

題目鏈接

題目大意

給你若干個(gè)0~9的數(shù)字,每個(gè)數(shù)字?jǐn)?shù)量為 Ai, i∈[0,9]买雾。讓你排列這些數(shù)字,使其按a+b-c+d-e+...這樣的加減交替得出的最終解為11的倍數(shù)杨帽。

思路

這道題相對(duì)第二題簡(jiǎn)單些漓穿,可以通過(guò)dp解決,但需要滾動(dòng)數(shù)組降維注盈。
dp[type][j][k]代表對(duì)于當(dāng)前數(shù)字i晃危,對(duì)j個(gè)執(zhí)行加法、對(duì)A[i]-j個(gè)執(zhí)行減法時(shí)老客,是否存在mod 11后結(jié)果為k的情況僚饭。
由于最終會(huì)有 總數(shù)/2 個(gè)執(zhí)行加法的,故dp[type][sum/2][0]即為劃分一半的數(shù)執(zhí)行加法胧砰、另一半執(zhí)行減法后鳍鸵,mod 11為0的情況是否存在,即為題解尉间。

代碼

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

int T;
const int MAXN = 1000;
vector<int> A (10, 0);
vector<vector<vector<bool>>> dp;

int main(int argc, const char * argv[]) {

    cin >> T;
    for (int kase = 1; kase <= T; ++kase) {
        cout << "Case #" << kase << ": ";

        int tot = 0;
        for (int i = 1; i <= 9; ++i) {
            cin >> A[i];
            // if large than 21/22, the overflow value is no need to be calculate
            A[i] = min(A[i], 20 + (A[i] & 1));
            tot += A[i];
        }

        dp = vector<vector<vector<bool>>> (2, vector<vector<bool>> (MAXN+10, vector<bool> (11, false)));
        int type = 0;
        dp[type][0][0] = true;
        for (int i = 1; i <= 9; ++i) {
            type = 1-type;

            for (auto& subarr: dp[type])
                fill(subarr.begin(), subarr.end(), false);

            for (int lcnt = 0; lcnt <= A[i]; ++lcnt) {
                for (int rcnt = 0; rcnt < MAXN-lcnt; ++rcnt) {
                    for (int premod = 0; premod <= 10; ++premod) {
                        int curmod = (premod + lcnt * i - (A[i]-lcnt) * i + 11) % 11;
                        while (curmod < 0) curmod += 11;
                        dp[type][lcnt + rcnt][curmod] = dp[1-type][rcnt][premod] || dp[type][lcnt + rcnt][curmod];
                    }
                }
            }
        }

        cout << (dp[type][tot >> 1][0] ? "YES" : "NO") << endl;;

    }

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末偿乖,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哲嘲,更是在濱河造成了極大的恐慌贪薪,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眠副,死亡現(xiàn)場(chǎng)離奇詭異画切,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)囱怕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)霍弹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毫别,“玉大人,你說(shuō)我怎么就攤上這事庞萍∨》常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵钝计,是天一觀的道長(zhǎng)恋博。 經(jīng)常有香客問(wèn)我,道長(zhǎng)私恬,這世上最難降的妖魔是什么债沮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮本鸣,結(jié)果婚禮上疫衩,老公的妹妹穿的比我還像新娘。我一直安慰自己荣德,他們只是感情好闷煤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著涮瞻,像睡著了一般鲤拿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上署咽,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天近顷,我揣著相機(jī)與錄音,去河邊找鬼宁否。 笑死窒升,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慕匠。 我是一名探鬼主播饱须,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼台谊!你這毒婦竟也來(lái)了冤寿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤青伤,失蹤者是張志新(化名)和其女友劉穎督怜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體狠角,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡号杠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨蟋。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屉凯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出眼溶,到底是詐尸還是另有隱情悠砚,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布堂飞,位于F島的核電站灌旧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绰筛。R本人自食惡果不足惜枢泰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铝噩。 院中可真熱鬧衡蚂,春花似錦、人聲如沸骏庸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)具被。三九已至玻募,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間硬猫,已是汗流浹背补箍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工改执, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留啸蜜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓辈挂,卻偏偏與公主長(zhǎng)得像衬横,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子终蒂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345