U33405 纽约

U33405 纽约

花费 \(w\) 元可以购买一辆容量为 \(w\) 的车
现在你有 \(n <= 2000\) 个物品, 搬运策略: 一直搬能放下里面最重的, 直到任意物品都不能搬上为止
求满足运送次数 \(<= R\) 的情况下买车花费的最少钱数

Solution

二分花钱数, 模拟搬运过程, 复杂度 \(O(n^{2}\log{n})\)
因为物品排序后有单调性, 且只能用一次(搬一次), 使用链表优化, 总复杂度\(O(n \log{n})\)

可是这题我认为有问题
upd: 哦原来后面有说
问题出在在符合搬运策略的情况下, 出钱数与搬运次数不符合单调性
所以最后加了个往前面检查多次查看是否合法, 取较小值

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
#define REP(i, x, y) for(int (i) = (x);(i) <= (y);(i)++)
using namespace std;
int RD(){
    int out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const int maxn = 4019;
int num, R;
int w[maxn], l[maxn], r[maxn];
int minn, maxx;
bool cmp(int a, int b){return a > b;}
void init(){
    REP(i, 1, num)l[i] = i - 1, r[i] = i + 1;
    r[0] = 1;
    }
bool check(int k){
    init();
    int tim = 0, tot = 0, now = 0, left = num;
    while(1){
        now = r[0], tot = 0;
        tim++;
        while(now <= num){//运一次
            if(tot + w[now] <= k){//不超重
                tot += w[now];
                r[l[now]] = r[now];//链表删除
                l[r[now]] = l[now];
                left--;
                if(!left){//所有东西搬完检查次数
                    if(tim <= R)return 1;
                    return 0;
                    }
                }
            now = r[now];
            }
        if(tim > R)return 0;
        }
    }
int search(int l, int r){
    int ans = -1;
    while(l <= r){
        int mid = (l + r) >> 1;
        if(check(mid))ans = mid, r = mid - 1;
        else l = mid + 1;
        }
    return ans;
    }
int ans;
int main(){
    num = RD(), R = RD();
    REP(i, 1, num)w[i] = RD(), minn = min(minn, w[i]), maxx += w[i];
    sort(w + 1, w + 1 + num, cmp);
    int temp = search(minn, maxx);
    for(ans = temp - 51;ans <= temp && !check(ans);ans++);
    printf("%d\n", ans);
    return 0;
    }

转载于:https://www.cnblogs.com/Tony-Double-Sky/p/9747880.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
纽约CityBike是纽约市的一项享自行车计划,为居民和游客提供了方便、环保的交通工具。在该计划中,用户可以通过订阅会员、租赁自行车并在城市中骑行一段距离后将其归还。 Tableau是一种数据可视化工具,可以帮助我们深入分析和展示数据。我们可以使用Tableau分析纽约CityBike的数据,从而得出一些有意义的结论。 首先,我们可以使用Tableau分析每个区域的骑行频率。通过将纽约市划分为不同的区域并对每个区域的骑行次数进行统计,我们可以了解到哪些区域是骑行最频繁的地区,以及可能的原因。例如,繁忙的商业区、旅游景点周围的地区可能会有更多的骑行活动。 其次,我们可以使用Tableau对骑行时间和距离进行分析。通过绘制骑行时间和距离的散点图,我们可以看到骑行时间和距离之间的关系。这有助于我们了解用户在骑行时通常选择的路径和骑行时间的分布。这些信息能够帮助我们优化自行车的调度和站点的布置,以更好地满足用户的需求。 此外,我们还可以使用Tableau分析订阅会员和临时用户之间的骑行模式差异。通过分析两者的骑行频率、骑行时间和骑行距离,我们可以了解到不同类型用户的使用习惯和偏好,进而优化计划的运营。 总之,通过Tableau分析纽约CityBike的数据,我们可以更好地了解用户的行为模式和需求,从而为计划的改进提供依据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值