您的位置:首页 > 其它

Tsinsen A1129 税收与补贴问题

2016-04-06 22:32 387 查看
http://oj.tsinsen.com/ViewGProblem.page?gpid=A1129

分析:这个题我是暴力做的..没任何思想,一道诡异的数学题,每个线性都不一样我没推出如何确定可能的极值点。

代码:

#include "cstdio"
#include "algorithm"
using namespace std;

struct Node { int p, s; }Solve[100050];
bool f(const Node & a, const Node & b) { return a.p < b.p; }
int Delta, EPrice, cnt, ESell, CPrice, CSell;

int main() {
scanf("%d%d%d", &EPrice, &CPrice, &CSell);
Solve[cnt].p = CPrice; Solve[cnt].s = CSell; cnt += 1;
if (CPrice == EPrice) ESell = CSell;
int u, v;
while (scanf("%d%d", &u, &v), u != -1 && v != -1) {
Solve[cnt].p = u; Solve[cnt].s = v; cnt += 1;
if (u == EPrice) ESell = v;
}
scanf("%d", &Delta);
sort(Solve, Solve + cnt, f);
for (int i = 0, sup = cnt - 1; i < sup; ++i) {
int xDelta = (Solve[i].s - Solve[i + 1].s) / (Solve[i + 1].p - Solve[i].p);
int p = Solve[i].p + 1, s = Solve[i].s - xDelta;
while (p < Solve[i + 1].p) {
if (p == EPrice) ESell = s;
Solve[cnt].p = p; Solve[cnt].s = s;
cnt += 1; p += 1; s -= xDelta;
}
}
sort(Solve, Solve + cnt, f);
int p = Solve[cnt - 1].p + 1, s = Solve[cnt - 1].s - Delta;
while (s > 0) {
if (p == EPrice) ESell = s;
Solve[cnt].p = p; Solve[cnt].s = s;
cnt += 1; p += 1; s -= Delta;
}
for (int i = 0; i <= 500; ++i) {
int Std = (EPrice + i - CPrice) * ESell, Can = 1;
for (int k = 0; k < cnt; ++k) {
int Benifit = (Solve[k].p + i - CPrice) * Solve[k].s;
if (Benifit > Std) { Can = 0; break; }
}
if (Can) { printf("%d\n", i); return 0; }
}
for (int i = 1; i <= 500; ++i) {
int Std = (EPrice - i - CPrice) * ESell, Can = 1;
for (int k = 0; k < cnt; ++k) {
int Benifit = (Solve[k].p - i - CPrice) * Solve[k].s;
if (Benifit > Std) { Can = 0; break; }
}
if (Can) { printf("%d\n", -i); return 0; }
}
puts("NO SOLUTION");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: