Wooden Sticks
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Problem Description
There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:
(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.
You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).
Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.
Output
The output should contain the minimum setup time in minutes, one per line.
Sample Input
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
Sample Output
/************************************************************************/
题意:现有n跟木棍需要进行加工,告诉你每根木棍的长度l和重量w,并告知你加工第一根木棍需要1分钟的准备时间,而若接下来加工的木棍(长度为l',重量为w')如果l'>=l&&w'>=w的话,这根木棍不需要准备时间,否则,仍需要1分钟的准备时间,问为了使得需要准备的时间最短,你要合理安排加工木棍的顺序,最终给出最短的准备时间是多少即可
解题思路:该题考查的就是贪心的思想,只要每次你加工的木棍的长度l'与重量w'满足题目条件的情况下做到最接近就可以了,不需要担心满足了长度不满足重量或满足了重量不满足长度的情况,因为按照这种做法必定是最优解,不信可以试着自己举举例子
比如
5 3
2 6
3 3
2 4
4 2
1 1
①我们可以按照长度优先,重量次之来取
可以这样分组
1 1->2 4->2 6一组
3 3->5 3一组
4 2一组
共三组,需要3分钟准备时间
②我们按照重量优先,长度次之来取
可以这样分组
1 1->4 2->5 3一组
3 3一组
2 4->2 6一组
同样也是三组,需要3分钟准备时间
由上可知,虽然你安排的方案略有不同,但是只要是同一种原理,结果是一样的,即准备时间必定相等
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 5005;
const int inf = 1000000000;
const int mod = 258280327;
struct group
{
int x,y;
}s[N];
bool cmp(group x,group y)
{
if(x.x!=y.x)
return x.x<y.x;
return x.y<y.y;
}
bool v[N];
int main()
{
int t,n,i,j,ans,l,w;
scanf("%d",&t);
while(t--)
{
ans=0;
memset(v,false,sizeof(v));
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&s[i].x,&s[i].y);
sort(s,s+n,cmp);
for(i=0;i<n;i++)
if(!v[i])
{
l=s[i].x,w=s[i].y;
for(j=0;j<n;j++)
if(!v[j]&&s[j].x>=l&&s[j].y>=w)
l=s[j].x,w=s[j].y,v[j]=true;
ans++;
}
printf("%d\n",ans);
}
return 0;
}
菜鸟成长记