洛谷P1023 税收与补贴问题

#ifdef __GNUC__
#include <bits/stdc++.h>
#else
#include "bits/stdc++.h"
#pragma warning(disable:4996)
#endif // __GNUC__
using namespace std;
int hope;
int sub;
int cost;
const int N = 100000;
int num[N + 5] = { 0 };
vector<int> v;
int main()
{
    scanf("%d", &hope);
    scanf("%d", &cost);
    v.push_back(cost);
    scanf("%d", num + cost);
    int max_price = 0;
    while (1)
    {
        int a, b;
        scanf("%d%d", &a, &b);
        if (a == -1 && b == -1)
            break;
        num[a] = b;
        v.push_back(a);
    }
    sort(begin(v), end(v));
    max_price = v[v.size() - 1];
    for (int i = 1; i < v.size(); ++i)
    {
        int k = (num[v[i - 1]] - num[v[i]]) / (v[i - 1] - v[i]);
        for (int j = v[i - 1] + 1; j < v[i]; ++j)
            num[j] = num[j - 1] + k;
    }
    scanf("%d", &sub);
    for (int i = max_price + 1; i <= N && num[i - 1] >= sub; ++i)
        num[i] = num[i - 1] - sub;
    double d_left = cost - hope + num[hope + 1] / (double)(num[hope] - num[hope + 1]);
    double d_right = cost - hope + num[hope - 1] / (double)(num[hope - 1] - num[hope]);
    int left = d_left;
    int right = d_right;
    if (d_left != left)
        left = (d_left > 0) ? left + 1 : left;
    if (d_right != right)
        right = (d_right > 0) ? right : right - 1;
    int ans = (abs(left) < abs(right)) ? left : right;
    printf("%d", ans);
#ifndef __GNUC__
    system("pause");
#endif // !__GNUC__
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值