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).
(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).
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
2
1
3
题意:有长度和重量两个属性,比如第一个测试样例中:4是长度,9是重量,5是长度,2是重量。。。。。。;
其实就是找有多少个非降序的子序列,只不过这里要求它的长度和重量都要非降序而已,用结构体即可解决
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct A
{
int len,weight,vis;//vis标记是否比较过了
} f[5001];
bool cmp(A x,A y)//按照长度从大到小排序,长度相同时,按照重量从小到大排序
{
if(x.len!=y.len)
return x.len<y.len;
return x.weight<y.weight;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
int ans=0;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d %d",&f[i].len,&f[i].weight);
f[i].vis=0;
}
sort(f,f+n,cmp);
for(int i=0; i<n-1; i++)
{
int x=i;
if(f[i].vis)
continue;
ans++;
for(int j=i+1; j<n; j++)
{
if(f[j].vis)
continue;
if(f[x].weight<=f[j].weight)
{
f[j].vis=1;
x=j;
}
}
}
if(f[n-1].vis==0)//防止孤僻性格的木材
ans++;
printf("%d\n",ans);
}
return 0;
}
/*
1 4
2 1
3 5
4 9
5 2
*/