比赛 防止浮躁的小练习v0.4 评测结果 AAAAAAAAAA
题目名称 走出金字塔 最终得分 100
用户昵称 Fmuckss 运行时间 0.011 s
代码语言 C++ 内存使用 0.31 MiB
提交时间 2016-10-13 18:54:40
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int inf = 2e9;

inline int cal(int dx, int dy) {
	int ans = 2;
	ans += (dx - 1) * 2;
	ans += max(0, dy - (dx - 1));
	return ans;
}

int n, m, k, s;
int xa, xb;

inline void solve() {
	scanf("%d %d %d %d", &n, &m, &k, &s);
	scanf("%d %d", &xa, &xb);
	
	int frx, fry, tox, toy, ans = inf, x, y;
	for (int i = 1; i <= m; i++) {
		scanf("%d %d", &x, &y);
		frx = xa, fry = xb, tox = x, toy = y;
		y = fry;
			
		if (frx > tox) {
			swap(frx, tox);
			swap(fry, toy);
			y = fry;
		}
		
		if (not (fry & 1)) {
			if (toy & 1) {
				toy++;
				if (toy <= tox * 2 - 1) {
					fry++;
					if (fry <= frx * 2 - 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 2); 
					fry -= 2;
					if (fry >= 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 2); 
				}
				fry = y;
				toy -= 2;
				if (toy >= 1) {
					fry++;
					if (fry <= frx * 2 - 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 2); 
					fry -= 2;
					if (fry >= 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 2); 
				}
			} else {
				fry++;
				if (fry <= frx * 2 - 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 1); 
				fry -= 2;
				if (fry >= 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 1); 
			}
		} else {
			if (toy & 1) {
				toy++;
				if(toy <= tox * 2 - 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 1); 
				toy -= 2;
				if (toy >= 1) ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx))) + 1); 
			} else {
				ans = min(ans, cal(tox - frx, abs((toy - tox) - (fry - frx)))); 
			}
		}
	}
	
	printf("%d\n", s - ((ans - 1) * k + 1) < 0 ? -1 : s - ((ans - 1) * k + 1));
}

int main() {
	freopen("ha14c.in", "r", stdin);
	freopen("ha14c.out", "w", stdout);
	solve();
	return 0;
}