NYOJ-236 心急的C小加

心急的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


  1 /*
  2 代码一: ----TLE
  3 思路: 动态规划---- 先按照长度排序,然后根据重量求最长递减子序列
  4 即为所求,可惜超时了
  5 
  6 #include <cstdio>
  7 #include <iostream>
  8 #include <algorithm>
  9 using namespace std;
 10 
 11 struct stick
 12 {
 13     int len;
 14     int weight;
 15 }a[5001];
 16 
 17 bool cmp(stick p, stick q)
 18 {
 19     if(p.len == q.len)
 20         return p.weight < q.weight;
 21     else
 22         return p.len < q.len;
 23 }
 24 
 25 int solve(int n)
 26 {
 27     int dp[5001];
 28     int max = -1;
 29     for(int i = 0; i < n; ++i)
 30     {
 31         dp[i] = 1;
 32         for(int j = 0; j < i ;++j)
 33         {
 34             if(a[i].weight < a[j].weight && dp[j] + 1 > dp[i])
 35                 dp[i] = dp[j] + 1;
 36             if(dp[i] > max)
 37                 max = dp[i];
 38         }
 39     }
 40     return max;
 41 }
 42 
 43 int main()
 44 {
 45     int T, n;
 46     scanf("%d", &T);
 47     while(T--)
 48     {
 49         scanf("%d", &n);
 50         for(int i = 0; i < n; ++i)
 51             scanf("%d%d", &a[i].len, &a[i].weight);
 52         sort(a, a + n, cmp);
 53         printf("%d\n", solve(n));
 54     }
 55     return 0;
 56 }
 57 
 58 */
 59 代码二:----AC
 60 思路:先排序,然后根据贪心原则依次过滤
 61 #include <cstdio>
 62 #include <iostream>
 63 #include <algorithm>
 64 using namespace std;
 65 
 66 struct stick
 67 {
 68     int len;
 69     int weight;
 70 }a[5001];
 71 
 72 bool cmp(stick p, stick q)
 73 {
 74     if(p.len == q.len)
 75         return p.weight < q.weight;
 76     else
 77         return p.len < q.len;
 78 }
 79 
 80 int solve(int n)
 81 {
 82     int t, cnt = 0;
 83     for(int i = 0; i < n; ++i)
 84     {
 85         if(a[i].weight)
 86         {
 87             ++cnt;
 88             t = a[i].weight;
 89             a[i].weight = 0;
 90             for(int j = i + 1; j < n ;++j)
 91             {
 92                 if(a[j].weight >= t)
 93                 {
 94                     t = a[j].weight;
 95                     a[j].weight = 0;
 96                 }
 97             }
 98         }
 99     }
100     return cnt;
101 }
102 
103 int main()
104 {
105     int T, n;
106     scanf("%d", &T);
107     while(T--)
108     {
109         scanf("%d", &n);
110         for(int i = 0; i < n; ++i)
111             scanf("%d%d", &a[i].len, &a[i].weight);
112         sort(a, a + n, cmp);
113         printf("%d\n", solve(n));
114     }
115     return 0;
116 }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值