zoukankan      html  css  js  c++  java
  • U33405 纽约 (二分)

    【题目描述】

        牧民 Azone 需要多次往返于两个草场之间运输家当。为了顺利转场,Azone 决定花费 w元津巴布韦币,购买一辆载重为 w 的汽车。共有 n 件家具需要搬运,每件家具的重量为 wi 。Azone 每次出发前,会搬若干件总重不超过 w 的物品上车:出发前,车是空载的,Azone 会选择能搬上车的家具中最重的一件放上车(即该家具之前还未运走且放置该家具后汽车不会超载),然后在剩下的家具中继续选择一件能被搬走的最重的上车,持续装车,直至剩下的家具都塞不上车。装载完毕后,Azone 会开车运走这些家具,卸在目的地,再驾空车返回继续运送,直至转场完毕。Azone 希望在运送次数不超过 R 的情况下完成转场,求 Azone 最少需要购置价值多少的车。

    【题目链接】

        https://www.luogu.org/problemnew/show/U33405

    【算法】

        直接二分结果不一定是最优解,存在w时可行而w+1不可行的情况。但是若w可行则w+Biase(偏置值>=max(w【i】))必定可行,所以先二分然后往前枚举max(w【i】)个。重点是为什么二分结果不一定是最优解,因为题目当中采取的装载策略(贪心策略:取尽可能重)并非最优策略(贪心成立的时候记得是坐船问题:一个船最多坐两个人,并且有载重限制,可以证明)。

    【代码——模拟贪心策略,对每一个家具遍历已经开出的装载集合,若能装则装否则重新开一个集合】

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n,r,i,l,j,R,ans;
     4 int a[2010],rec[2010];
     5 bool cmp(int a,int b) { return a>b; }
     6 bool valid(int cur)
     7 {
     8     if(cur<a[1]) return false;
     9     memset(rec,0,sizeof(rec));
    10     int tot=0;
    11     for(i=1;i<=n;i++) {
    12         int flag=0;
    13         for(j=1;j<=tot;j++)
    14             if(rec[j]+a[i]<=cur) {
    15                 rec[j]+=a[i],flag=1;
    16                 break;
    17             }
    18         if(!flag) rec[++tot]=a[i];
    19         if(tot>R) return false;
    20     }
    21     return true;
    22 }
    23 int main()
    24 {
    25     scanf("%d%d",&n,&R);
    26     for(i=1;i<=n;i++) scanf("%d",&a[i]),r+=a[i];
    27     sort(a+1,a+n+1,cmp);
    28     l=a[1];
    29     while(l<r) {
    30         int mid=(l+r)>>1;
    31         if(valid(mid)) r=mid;
    32         else l=mid+1;
    33     }
    34     ans=l;
    35     for(int i=1;i<=a[1]&&l-i>=a[1];i++)
    36         if(valid(l-i)) ans=l-i;
    37     printf("%d
    ",ans);
    38     return 0;
    39 }
  • 相关阅读:
    图片不能显示
    Lambda表达式where过滤数据
    存储文本到一个文件里
    获取用户临时文件夹路径
    判断某一个字符串是否存在另一个字符串中
    使用反射为特性赋值
    字符串与数据流之间的转换
    控制台应用程序获取计算机名
    重复输出字符或字符串
    使用HashSet<>去除重复元素的集合
  • 原文地址:https://www.cnblogs.com/Willendless/p/9393636.html
Copyright © 2011-2022 走看看