官方题解
A - ASCII Addition
Gym - 101480A
题意:给出用ASCII组成的两个位数≤9的加法式子,求出解并再以ASCII的形式输出
思路:直接模拟,傻逼了把一个地方的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个字母,如果放不下就放在下一行,然后算每行的第一个单词有多少字母(每两个单词之间有一个空格)
思路:据说直接模拟就能过
C - Cow Confinement
Gym - 101480C
题意:一个行,列的网格图,上面有一些牛、花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,牛也不能穿过围栏和地图边界,求每头牛它能到达的花的数量。注意栅栏不会相交。
思路:差分+扫描线+线段树
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
题意:一个骰子在一个人正方形内,蜜蜂在任意一个位置可以出现,问看到点数的期望。
思路:半平面交+概率期望
I - Ice Igloos
Gym - 101480I
题意:给你n个圆,m条线段,求每条线段与多少圆相交
J - Juice Junctions
Gym - 101480J
题意:给出一个无向图,n个点,m条边,(2 ≤ n ≤ 3000, 0 ≤ m ≤ 4500)
每条边上的容量都为1,求所有a->b(a < b)最大流的和。 时限 7s
思路:本想暴一下跑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)。
原点是出口,为了从开始逃离迷宫,我们要从不同的起点到达原点,每一步可向上,下,左或右。对于每个起点,确定是否可以逃离迷宫。