HDU 5032 Always Cook Mushroom

题意:

一块田地坐标从(1,1)到(1000,1000)  每块田地能种(x+A)*(y+B)的蘑菇  问  形似(0,0)(p,0)(p,q)这样的三角形区域能种的蘑菇的数量

思路:

其实很简单  枚举x  根据输入的向量  我们可以求出每个x对应最高的y  然后对于y可以用等差数列求和  再加上y个B  最后乘(x+A)就好了  但是这题时间卡得挺恶心的…

一开始写完T了  输入开挂还T  看了别人的代码发现y那个部分可以提出来打表做(就是代码中的f数组)  本以为稳A了  还是T…  仔细考虑后发现有些变量没必要定义成long long  改完才A…  没什么思维含量  要细心!!

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<cassert>
#include<vector>
#include<set>
#include<map>
#include<queue>
using namespace std;
typedef long long LL;
#define N 1010

int T, t, a, b, m, dx, dy, x;
LL ans;
int f[N];

inline void scand(int &ret) {
	char c;
	ret = 0;
	while ((c = getchar()) < '0' || c > '9')
		;
	while (c >= '0' && c <= '9')
		ret = (ret << 3) + (ret << 1) + (c - '0'), c = getchar();
}

int main() {
	int i, Y;
	scand(T);
	for (t = 1; t <= T; t++) {
		printf("Case #%d:\n", t);
		scand(a);
		scand(b);
		scand(m);
		for (i = 1; i <= 1000; i++)
			f[i] = (i + 1) * i / 2 + i * b;
		while (m--) {
			scand(dx);
			scand(dy);
			scand(x);
			ans = 0;
			for (i = 1; i <= x; i++) {
				Y = i * dy / dx;
				ans += (LL) f[Y] * (a + i);
			}
			printf("%I64d\n", ans);
		}
	}
	return 0;
}


你可能感兴趣的:(HDU,杂题)