2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)

官方题解


A - ASCII Addition

Gym - 101480A
题意:给出用ASCII组成的两个位数≤9的加法式子,求出解并再以ASCII的形式输出

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第1张图片
A - ASCII Addition

思路:直接模拟,傻逼了把一个地方的y写成了x,而且还巧妙地通过了各种样例(???),就这样自闭到终场(−_−#)……
AC代码

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 500;
char s[10][maxn];
int str[20];
char pr[10][maxn];
typedef long long ll;
ll ans;
char one[10][10] = {
"....x",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
};
char two[10][10] = {
"xxxxx",
"....x",
"....x",
"xxxxx",
"x....",
"x....",
"xxxxx"
};
char three[10][10] = {
"xxxxx",
"....x",
"....x",
"xxxxx",
"....x",
"....x",
"xxxxx"
};
char four[10][10] = {
"x...x",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"....x"
};
char five[10][10] = {
"xxxxx",
"x....",
"x....",
"xxxxx",
"....x",
"....x",
"xxxxx"
};
char six[10][10] = {
"xxxxx",
"x....",
"x....",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
};
char seven[10][10] = {
"xxxxx",
"....x",
"....x",
"....x",
"....x",
"....x",
"....x"
};
char eight[10][10] = {
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"x...x",
"x...x",
"xxxxx"
};
char nine[10][10] = {
"xxxxx",
"x...x",
"x...x",
"xxxxx",
"....x",
"....x",
"xxxxx"
};
char zero[10][10] = {
"xxxxx",
"x...x",
"x...x",
"x...x",
"x...x",
"x...x",
"xxxxx"
};

void solve(int cnt) {
    int temp, st;
    for(int k = 0; k < 7; ++k) {
        for(int i = cnt-1; i >= 0; --i) {
            temp = str[I];
            st = 0 + 6 * (cnt - i - 1);
            if(i != cnt-1)
                pr[k][st-1] = '.';
            for(int j = 0; j < 5; ++j) {
                if(temp == 0) pr[k][st+j] = zero[k][j];
                else if(temp == 1) pr[k][st+j] = one[k][j];
                else if(temp == 2) pr[k][st+j] = two[k][j];
                else if(temp == 3) pr[k][st+j] = three[k][j];
                else if(temp == 4) pr[k][st+j] = four[k][j];
                else if(temp == 5) pr[k][st+j] = five[k][j];
                else if(temp == 6) pr[k][st+j] = six[k][j];
                else if(temp == 7) pr[k][st+j] = seven[k][j];
                else if(temp == 8) pr[k][st+j] = eight[k][j];
                else if(temp == 9) pr[k][st+j] = nine[k][j];
            }
        }
    }
}

int getnum(int x, int y) {
    if(s[x+2][y+2] == 'x')  return 10; // +
    if(s[x+2][y] == 'x' && s[x+2][y+4] == 'x' && s[x+4][y] == 'x' && s[x+4][y+4] == 'x' && s[x+3][y+2] == '.') return 0;
    if(s[x][y] == '.') return 1;
    if(s[x+2][y] == '.' && s[x+4][y+4] == '.' && s[x+2][y+4] == 'x' && s[x+4][y] == 'x') return 2;
    if(s[x+2][y+4] == 'x' && s[x+4][y+4] == 'x' && s[x+2][y] == '.' && s[x+4][y] == '.' && s[x+3][y] == 'x') return 3;
    if(s[x][y] == 'x' && s[x][y+1] == '.') return 4;
    if(s[x+1][y+4] == '.' && s[x+4][y] == '.') return 5;
    if(s[x+1][y+4] == '.' && s[x+4][y] == 'x') return 6;
    if(s[x+3][y] == '.' && s[x][y] == 'x') return 7;
    if(s[x+2][y] == 'x' && s[x+2][y+4] == 'x' && s[x+4][y] == 'x' && s[x+4][y+4] == 'x' && s[x+3][y+2] == 'x' ) return 8;
    if(s[x+2][y] == 'x' && s[x+2][y+4] == 'x' && s[x+4][y+4] == 'x' && s[x+4][y] == '.' && s[x+6][y] == 'x') return 9;
}

int main() {
    for(int i = 0; i < 7; ++i)
        scanf("%s", s[I]);
    int len = strlen(s[0]);
    int cnt = (len+1) / 6;
    int temp;
    ll a = 0, b = 0;
    bool flag = false;
    for(int k = 0; k < cnt; ++k) {
        temp = getnum(0, 6*k);
        if(temp == 10) {
            flag = true;
            continue;
        }
        if(!flag) {
            a *= 10;
            a += temp;
        }
        else {
            b *= 10;
            b += temp;
        }
    }
    ans = a + b;
    int knt = 0;
    while(ans) {
        temp = ans % 10;
        ans /= 10;
        str[knt] = temp;
        knt++;
    }
    solve(knt);
    for(int i = 0; i < 7; ++i) {
        printf("%s\n", pr[I]);
    }
    return 0;
}

B - Book Borders

Gym - 101480B

题意:把一堆单词写下来,一列能放a~b个字母,如果放不下就放在下一行,然后算每行的第一个单词有多少字母(每两个单词之间有一个空格)

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第2张图片
B - Book Borders

思路:据说直接模拟就能过

C - Cow Confinement

Gym - 101480C
题意:一个行,列的网格图,上面有一些牛、花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,牛也不能穿过围栏和地图边界,求每头牛它能到达的花的数量。注意栅栏不会相交。

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第3张图片
C - Cow Confinement

思路:差分+扫描线+线段树

D - Digit Division

Gym - 101480D
题意:给出一个数字串,现将其分成一个或多个子串,要求分出来的每个子串能 % M等于0。求方案数(mod 10^9+7)
思路:找前缀 % M == 0 的点为断点,如果符合的数量为k,那么答案就是,要特判一下串整体是否 % M == 0
AC代码

# include 
using namespace std;

const int MAX = 3e5 + 5;
const int MOD = 1e9 + 7;
int n, m;
char digit[MAX];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(cin >> n >> m) {
        cin >> digit;
        bool right = false;
        int ans = 0;
        long long temp = 0;
        for(int i = 0; i < n; i++) {
            temp *= 10;
            temp += digit[i] - '0';
            temp %= m;
            if(temp == 0) {
                if(i == n - 1)
                    right = true;
                ans++;
            }
        }
        long long res = 1;
        if(!right) {
            cout << 0 << endl;
        }
        else {
            for(int i = 1; i < ans; i++) {
                res *= 2;
                res %= MOD;
            }
            cout << res << endl;
        }
    }
}

E - Export Estimate

Gym - 101480E

F - Frightful Formula

Gym - 101480F
题意:给出一个n*n矩阵的第一行和第一列,其余的数通过如下公式推出:
,求 %

G - Greenhouse Growth

Gym - 101480G
题意:你从计算机科学转向农业,并且你的新工作涉及向日葵在地下温室的生长,温室中包括n朵向日葵,这些向日葵被排成一排,并且从左到右编号分别为1...n。有两盏灯来提供向日葵生长所需要的光和热:A灯在一排的最左端,而B灯在一排的最右端。
每一天都一定会有一个灯开着,并使向日葵转向灯光,而且有几个向日葵会因此而成长。向日葵仅仅当它前面的(朝向灯的方向)向日葵比它高时它才会成长,而且成长时是匀速的,每一天都会成长1 cm,注意,当一个向日葵开始成长时,它还可能使得在它后面的向日葵瞬间成长。
给出每株向日葵的高度,还有每天开灯的时间表,要求求出最后所有的向日葵的高度。

H - Hovering Hornet

Gym - 101480H
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望。

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第4张图片
Gym - 101480H

思路:半平面交+概率期望

I - Ice Igloos

Gym - 101480I
题意:给你n个圆,m条线段,求每条线段与多少圆相交

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第5张图片
I - Ice Igloos

J - Juice Junctions

Gym - 101480J
题意:给出一个无向图,n个点,m条边,(2 ≤ n ≤ 3000, 0 ≤ m ≤ 4500)
每条边上的容量都为1,求所有a->b(a < b)最大流的和。 时限 7s

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第6张图片
Gym - 101480J

思路:本想暴一下跑1.5e5次s-t最大流…可是最大流跑的过程中改变了一些路上的权,这样存边重新建边肯定会T。

K - Kernel Knights

Gym - 101480K
题意:有两队骑士各n人,每位骑士会挑战对方队伍的某一个位骑士. (可能相同)要求找以一个区间S:集合S中的骑士不会互相挑战;每个集合外的骑士必定会被集合S内的某个骑士挑战。

L - Looping Labyrinth

Gym - 101480L
题意:一个n×m的矩形,其中每格为路或墙,通过将图案平移来获得迷宫。迷宫是一个大小有限的坐标系,其图案在四个方向上重复。
用整数(包括负整数)表示横纵坐标。向下行数增加,向右列数增加,坐标(0,0)处称为原点。特别地,图案的左上角在原点,而右下角在坐标(n−1,m−1)。
原点是出口,为了从开始逃离迷宫,我们要从不同的起点到达原点,每一步可向上,下,左或右。对于每个起点,确定是否可以逃离迷宫。

2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15)_第7张图片
L - Looping Labyrinth

你可能感兴趣的:(2015-2016 ACM-ICPC, Central Europe Regional Contest (CERC 15))