心急的C小加

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
 
描述

C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

 
输入
第一行是一个整数T(1<T<1500),表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。
输出
处理这些木棒的最短时间。
样例输入
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
样例输出
2
1
3
贪心问题+最长递增子序列问题
将输入的数据按照长度进行排序,然后根据重量选择递增的最长子序列,不同的子序列之间耗费一个单位的时间
#include <iostream>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
struct Stick{
int l,w;
Stick(int ll = , int ww = ):l(ll), w(ww){}
bool operator<(const Stick& a) const{
if(l!=a.l) return l < a.l;
else return w < a.w;
}
};
int main(){
int T;
cin >> T;
for(int icase = ; icase < T; icase++){
int n;
cin >> n;
vector<Stick> stick(n);
for(int i = ; i < n; ++ i)
cin >> stick[i].l >> stick[i].w;
sort(stick.begin(),stick.end());
int cnt = ;
for(int i = ; i < n; ++ i){
if(stick[i].w){
cnt++;
int minWeight = stick[i].w;
stick[i].w = ;
for(int j = i+; j < n; ++ j){
if(stick[j].w >= minWeight){
minWeight =stick[j].w;
stick[j].w = ;
}
}
}
}
cout<<cnt<<endl;
}
}

 

最新文章

  1. Html中的文本框和单选按钮
  2. Oracle 之SQL_Loader
  3. grunt-replace和grunt-include-replace问题
  4. TSQL点滴
  5. mvc-5视图和模版
  6. 自动备份并保存最近几天的SQL数据库作业脚本
  7. Hibernate Is Not Mapped(实体名 is not mapped [from book where id=&#39;0&#39;])
  8. 浅谈C#抽象类和C#接口
  9. php 针对特殊字符进行转义
  10. 更快的memcpy
  11. jade模板引擎简明用法
  12. heartbeat+DRBD 高可用 双机热备
  13. UML小白入门基础教程
  14. Linux 安装 JDK 8
  15. open
  16. 利用chrome浏览器爬取数据
  17. Docker在Linux上运行NetCore系列(四)使用私有Nuget与多个本地包引用运行ASPNetCore
  18. 【杂谈】对IO与NIO的认识
  19. day13 多个装饰器叠加 生成式
  20. Android-Java-Thread线程两种方式的使用场景

热门文章

  1. DBCC常用命令小汇
  2. PHP中array_merge和array相加的区别分析
  3. SQL Server数据库大型应用解决方案总结(转载)
  4. 无废话ExtJs 入门教程三[窗体:Window组件]
  5. Java 初学记录之一 快速输入
  6. 用PHPcms V9四步完成WAP手机站搭建
  7. hdu 5437 优先队列+模拟 **
  8. Mesa 3D
  9. url地址中 &quot;&amp;&quot; &quot;/&quot;等符号的转义处理(转)
  10. javascript的笔记精简版