题目http://www.spoj.com/problems/CHOCOLA/

把一整块巧克力分成一个一个单元,掰断每一横行有个代价值,掰断每个纵行也有个代价值,要你求最后的总代价值最小

这个题目放在DP的题目列表里面,起初我是按DP的思想去解,先考虑只有一个单元的巧克力,再考虑2个单元,再是3个。。当把一个橫行都处理完再处理第二行,但是在处理第二行的时候就出问题了,到底此时是掰断橫行还是纵行,这里的操作会对之后造成影响,所以我这样,不是真正的最优子结构,因此这样DP就要出问题。后来发现原来直接贪心就可以了。

为了使总代价值最小,肯定要先掰断代价值最大的,这样使得那些代价值大的操作不会进行太多,因此结果肯定是最优的。所以先分别对 橫行代价值 与 纵行代价值 降序排序

在贪心过程中,需要注意一些细节,设置两个指针p q 分别指向此时橫行 和纵行 最大的代价值,每次比较这两个值,优先操作最大的,然后每次掰断了橫行的话,必定会引来一次纵行的全部拆散,反过来同样成立,。。。这个我也不知道怎么证明,不过确实是对的,。。其实我此刻靠在椅子上突然想明白为什么了,其实排序的过程,相当于把巧克力重新组合了一下,把价值大的横和纵 放在了最顶端 和 最右端,所以每次掰断相应的行列,就需要把那落单的一行 或者 一列 给全部拆解完! (这个是关键!)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1005
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int x[N],y[N];
int m,n;
int main()
{
int t;
int i,j;
scanf("%d",&t);
while (t--)
{
scanf("%d%d",&m,&n);
for (i=;i<m;i++)
{
scanf("%d",&x[i]);
}
for (i=;i<n;i++)
{
scanf("%d",&y[i]);
}
sort(x+,x+m,cmp);
sort(y+,y+n,cmp);
int p=,q=,ans=;
while (p<=m- || q<=n-)
{
if (p<=m- && x[p]>=y[q])
{
ans+=x[p];
for (j=q;j<=n-;j++) //每次掰出了一段,就拆解它 下面同理。
ans+=y[j];
p++;
}
if (q<=n- && y[q]>x[p])
{
ans+=y[q];
for (j=p;j<=m-;j++)
ans+=x[j];
q++;
}
if (p==m)
{
for (j=q;j<=n-;j++)
ans+=y[j];
q=n;
}
if (q==n)
{
for (j=p;j<=m-;j++)
ans+=x[j];
p=m;
}
}
printf("%d\n",ans);
}
return ;
}

SPOJ 247 chocolate (CHOCLO)的更多相关文章

  1. spoj 247

    不管行列   总是先切割切割费用大的  代码比较烂 ...... #include <iostream> #include <cstdio> #include <cstr ...

  2. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  3. SPOJ DQUERY D-query(主席树)

    题目 Source http://www.spoj.com/problems/DQUERY/en/ Description Given a sequence of n numbers a1, a2, ...

  4. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  5. 【填坑向】spoj COT/bzoj2588 Count on a tree

    这题是学主席树的时候就想写的,,, 但是当时没写(懒) 现在来填坑 = =日常调半天lca(考虑以后背板) 主席树还是蛮好写的,但是代码出现重复,不太好,导致调试的时候心里没底(虽然事实证明主席树部分 ...

  6. SPOJ bsubstr

    题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...

  7. 【SPOJ 7258】Lexicographical Substring Search

    http://www.spoj.com/problems/SUBLEX/ 好难啊. 建出后缀自动机,然后在后缀自动机的每个状态上记录通过这个状态能走到的不同子串的数量.该状态能走到的所有状态的f值的和 ...

  8. 【SPOJ 1812】Longest Common Substring II

    http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...

  9. 【SPOJ 8222】Substrings

    http://www.spoj.com/problems/NSUBSTR/ clj课件里的例题 用结构体+指针写完模板后发现要访问所有的节点,改成数组会更方便些..于是改成了数组... 这道题重点是求 ...

随机推荐

  1. 利用 Ruoyi 开发自己的业务管理系统__测试结构完成

    前言铺垫不多说 (1)Ruoyi这个平台不错:如果你觉得你比Ruoyi的作者牛逼,你就不用看我这个文章了,你可以走了,因为我自认为比Ruoyi的作者要烂: (2)必须已经成功搭建Ruoyi,并能在自己 ...

  2. docker安装并设置开机启动(Linux)

    docker 开机启动: systemctl enable docker 使用的linux系统为CentOS7.2 docker分为CE和EE版本,EE版本收费,一般我们使用CE版本就满足要求了 do ...

  3. delphi http请求用到的编码方式

    uses HttpEncode: HttpEncode(AnsiToUtf8('***'))

  4. 吴裕雄--天生自然java开发常用类库学习笔记:System类

    public class SystemDemo01{ public static void main(String args[]){ long startTime = System.currentTi ...

  5. 08 SSM整合案例(企业权限管理系统):05.SSM整合案例的基本介绍

    04.AdminLTE的基本介绍 05.SSM整合案例的基本介绍 06.产品操作 07.订单操作 08.权限控制 09.用户和角色操作 10.权限关联 11.AOP日志 05.SSM整合案例的基本介绍 ...

  6. C# OBJ模型解析的封装(网上看到的保留一份)

    /// <author>Lukas Eibensteiner</author> /// <date>19.02.2013</date> /// < ...

  7. Windows按键消息—虚拟键码(转)

    源地址:http://c.biancheng.net/cpp/html/1253.html 虚拟键码保存在WM_KEYDOWN.WM_KEYUP.WM_SYSKEYDOWN和WM_SYSKEYUP消息 ...

  8. JSP编码规范

    JSP包含文件 <%@ include file=”relativeURI”%> //在翻译阶段执行加载,比如:校验是否登录通过 jsp的include指令元素读入指定页面的内容.并把这些 ...

  9. Oracle-SQL 建表

    建立员工分类表: 员工分类表结构.内容分别如下图:   一.使用PL/SQL Dev 这类可视化工具直接创建表 1.建立表结构 新建-table-名称(egrade)    然后 列:创建表结构 2. ...

  10. [APIO2012]派遣 可并堆

    Background 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. Description 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者 ...