题目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. DevOps - 优势

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  2. Linux学习《第四章shell脚本练习一》随堂练习(重要)

  3. Html5 自学笔记

      1 html的全称 Hyper Text Markup Language 2 HTML的意义 使用标记标签( Markup Tag)来描述网页 3 HTML标签一定成对吗 是 4 <html ...

  4. Hash!

    Panda一个字符串是否是另一个字符串的子串 #include<bits/stdc++.h> using namespace std; const int mod=998244353,tt ...

  5. php.laravel.middleware

    关于中间件,在php-laravel中的定义就是对请求的一个过滤,相当于JSP技术中的filter的存在.需要知道编写了一个中间件可以配置在三个地方(就目前5.7版本而言)让其发挥作用,具体需要看/a ...

  6. 记录一次ajax使用

    function getSSOUrl(urlvalue) { var urls; $.ajax({ type: "GET", url: "../../GeoManage/ ...

  7. ajax异步提交 有时会出现无bug的数据处理异常-----debug没有问题,正常运行却数据处理不正确,极少机会会出现正常的处理结果

    ajax  被使用时,常默认的就使用了异步处理. 当遇到后面的代码对同样的数据进行处理 或 要依赖前面ajax处理的结果时,就会导致数据处理结果不正确,未达到预期值. 且,debug时却能正常完成功能 ...

  8. hdu 3790 最短路径dijkstra(多重权值)

    最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  9. C# Stream篇(二) -- TextReader 和StreamReader

    TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 从StreamReader想到多态 简 ...

  10. 【剑指Offer】面试题22. 链表中倒数第k个节点

    题目 输入一个链表,输出该链表中倒数第k个节点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点.例如,一个链表有6个节点,从头节点开始,它们的值依次是1.2.3.4.5.6. ...