Education CodeForces Round 25 题解

Education CodeForces Round 25 题解

Contest 825 Dashboard

A. Binary Protocol

题意

给出一个01串,这个串由十进制串encode得到,方法是每一位数字映射成为相同数量的1,数字之间用0隔开。

思路

水。

代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, cur = 0, cnt = 0;
    char s[100], ans[100];
    scanf("%d%s", &n, s);
    for (int i = 0; i < n; ++i)
        s[i]-'0'? ++cnt : (ans[cur++] = cnt + '0', cnt = 0);
    ans[cur++] = cnt + '0';
    ans[cur] = '\0';
    puts(ans);
    return 0;
}

B. Five-In-a-Row

题意

给出一个五子棋盘,判断其中'X'是否是必胜态。

思路

模拟。

代码

#include <bits/stdc++.h>
using namespace std;

char maps[15][15];
int dir[8][2] = {{1, 0}, {-1, 0}, {0, -1}, {0, 1}, {1, 1}, {-1, -1}, {1, -1}, {-1, 1}};
bool flag = 0;

void judge(int x, int y) {
    maps[x][y] = 'X';
    for (int i = 0, cnt = 0; i < 10; ++i) {
        maps[x][i] == 'X'? ++cnt : cnt = 0;
        if (cnt == 5) flag = 1;
    }
    for (int i = 0, cnt = 0; i < 10; ++i) {
        maps[i][y] == 'X'? ++cnt : cnt = 0;
        if (cnt == 5) flag = 1;
    }
    for (int i = 0, j = 0, cnt = 0; i < 10 && j < 10; ++i, ++j){
        int u = i, v = y - x + j;
        if (y < 0 || y > 9) continue;
        maps[u][v] == 'X'? ++cnt : cnt = 0;
        if (cnt == 5) flag = 1;
    }
    for (int i = 0, j = 0, cnt = 0; i < 10 && j < 10; ++i, ++j) {
        int u = i, v = y + x - j;
        if (y > 9 || y < 0) continue;
        maps[u][v] == 'X'? ++cnt : cnt = 0;
        if (cnt == 5) flag = 1;
    }
    maps[x][y] = '.';
}

void check(int x, int y) {
    for (int i = 0; i < 8; ++i) {
        int u = x + dir[i][0], v = y + dir[i][1];
        if (u < 0 || v < 0 || u > 9 || v > 9) continue;
        if (maps[u][v] == '.') judge(u, v);
        if (flag) return;
    }
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    for (int i = 0; i < 10; ++i) scanf("%s", maps[i]);
    for (int i = 0; i < 10; ++i)
        for (int j = 0; j < 10; ++j) {
            if (maps[i][j] == 'X') check(i, j);
            if (flag) goto a; // 闲的蛋疼
        }
a:
    puts(flag ? "YES" : "NO");
    return 0;
}

C. Multi-judge Solving

题意

如果Makes做过难度为i的题目,他就可以做出i*2的题目。
一开始Makes做过的最高难度题是k,他要刷完他列表中所有的题,问中间需要多少道题作为跳板。

思路

贪心。把k放进数组中,然后排个序,upper_bound得到比k之后的一道题,判断是否能做出它,如果可以的话就继续upper_bound,否则判断一下需要多少道题作为跳板。

代码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, k, num[1007], ans = 0;
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; ++i) 
        scanf("%d", num+i);
    num[0] = k;
    sort(num, num+n+1);
    for (int now = k, nxt = upper_bound(num, num+n+1, now<<1) - num, cur = 1; nxt <= n; nxt = upper_bound(num, num+n+1, now<<1) - num) {
        now = num[nxt-1], cur = nxt-1;
        nxt = upper_bound(num, num+n+1, now<<1) - num;
        while (nxt == cur+1 && nxt != n+1) {
            ++ans, now <<= 1;
            nxt = upper_bound(num, num+n+1, now<<1) - num;
        }
    }
    printf("%d\n", ans);
    return 0;
}

D. Suitable Replacement

题意

给出一个主串s和一个模式串t,主串中有若干'?',需要把这些'?'填补起来。填补之后的字符串要求任意顺序中可以找到最多的模式串t

思路

本来想的是模拟+贪心,但是想想代码量会很大。

看了dalao的代码之后换一种思路:首先统计主串中有除了'?'之外的字符数量。然后遍历主串,每遇到一个'?'就找当前'?'数量相对应的t串的位置,如果这个位置是字符是主串中含有的,就将主串这个字符的数量--,并且重新遍历这个'?',直到遍历到一个主串中已经不含有的字符,就将t串这个字符填进去。

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6+7;

int main(){
    int hash[26] = {}, cur = 0, len_t;
    char s[maxn], t[maxn];
    scanf("%s%s", s, t);
    len_t = strlen(t);
    for (int i = 0; s[i]; ++i) ++hash[s[i]-'a'];
    for (int i = 0; s[i]; ++i) if (s[i] == '?') {
        ++cur, cur %= len_t;
        hash[t[cur]-'a'] > 0 ? (--hash[t[cur]-'a'], --i) : s[i] = t[cur];
    }
    puts(s);
    return 0;
}

E. Minimal Labels

题意

给出一张有向无环图,按照这张图的拓扑序给这张图的每一个节点标号,要求标号的排列是可能排列中字典序最小的。

思路

一开始想的是正常跑拓扑序,然后用优先队列来给最小的标号,但奚政巨hack了这种方法。主要问题还在于题意没有读清楚。我以为是标号对于的点的编号排列字典序最小。

既然正着不行,就反着来。反向建图,依然是优先队列,只是在拓扑序的过程中给最大的点标上最大的号。这样贪心就可以得到最佳匹配。

代码

#include <bits/stdc++.h>
using namespace std;
//#define LOCAL

const int maxn = 1e5+7;

struct Edge {
    int to, nxt, dis;
}edge[maxn];

int head[maxn], tot;
int degree[maxn] = {}, v[maxn], n;

priority_queue<int> q;

void init() {
    tot = 0;
    memset(head, -1, sizeof head);
    memset(degree, 0, sizeof degree);
}

void addnode(int u, int v) {
    ++degree[v];
    edge[tot].to = v;
    edge[tot].nxt = head[u];
    head[u] = tot++;
}

void topo_sort(int n) {
    int cur = n;
    for (int i = 1; i <= n; ++i)
        if (!degree[i]) q.push(i);
    while (!q.empty()) {
        int u = q.top(); q.pop();
        v[u] = cur--;
        for (int i = head[u]; i != -1; i = edge[i].nxt) {
            int v = edge[i].to;
            --degree[v];
            if (!degree[v]) q.push(v);
        }
    }
}

int main(){
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif
    init();
    int m; scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) v[i] = i;
    for (int i = 0, u, v; i < m; ++i) {
        scanf("%d%d", &v, &u);
        addnode(u, v);
    }
    topo_sort(n);
    for (int i = 1; i < n; ++i)
        printf("%d ", v[i]);
    printf("%d\n", v[n]);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...
    染微言阅读 558评论 0 3
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,301评论 0 160
  • 寒露是农历二十四节气中的第十七个节气,属于秋季的第五个节气,表示秋季时节的正式开始;时间在公历每年10月8日或9日...
    华枝春满5339阅读 524评论 2 18
  • 年青少狂曾哗燥,转眼斑鬓到花甲。人生事非烟云过,该是安稳渡夕阳!
    彦彦深秋阅读 136评论 0 0