POJ-1065 Wooden Sticks (C语言)
程序员文章站
2022-03-12 09:50:32
...
有N根木棍等待处理。机器在处理第一根木棍时需要准备1分钟,此后遇到长宽都不大于前一根木棍的木棍就不需要时间准备,反之则需要1分钟重新准备。比如木棍按照(3,3)、(1,3)、(1,4)、(2,3)的顺序进入,共需要准备3分钟
Input
第一行是T,表示测试数据个数。测试数据的第一行是N(1 <= N <= 5000)此后一行是 l1 , w1 , l2 , w2 ,…, ln , wn…长宽都小于10000
Output
每个一行,表示最短准备时间
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
2
1
3
思路:先按长度从大到小排列(连带着宽度),如果长度相同再按宽度从大到小交换位置。然后从比较的那根木棍(先是第一根)往后找,若有长和宽(小棍)都小于或等于这根的,就将(小棍)提到这根后面。依次这样,若没有这样的(小棍)则最短时间加一。
总体是贪心,先以比较的木棍为基准再从后找,看有没有长宽都小于它的。(以一个·为基准找另一个)
例如输入样例最终木棍的顺序如下图:
AC代码如下:
#include<stdio.h>
int main()
{
void insert(int a[],int x,int y);
void sort(int a[],int b[],int n);
int n;
scanf("%d",&n);
while(n--)
{
int m,i,j,a[10000]={0},b[10000]={0},c=0,d=0,num=1,cnt=0;
scanf("%d",&m);
while(m--)
{
scanf("%d",&a[c++]);//将表示木棍长度的存于a,表示宽度的存于b
scanf("%d",&b[d++]);
}
sort(a,b,d);//按长宽排序木棍
for(i=0;i<d;i++)
{
for(j=i+1;j<d;j++)
{
if(a[j]<=a[i]&&b[j]<=b[i])//找到长宽都小或等于的木棍提到i这根(即要比较的木棍)的后面
{
insert(a,i+1,j);
insert(b,i+1,j);
cnt=0;
break;
}
else
{
cnt++;
}
}
if(cnt==d-(i+1)&&i!=(d-1))
num++;
cnt=0;
}
printf("%d\n",num);
}
return 0;
}
void insert(int a[],int x,int y)//找到长宽都小于比较的木根的(小棍)就将它提到比较的那根的后面
{
int i,j,t;
t=a[y];
for(i=y;i>x;i--)
{
a[i]=a[i-1];
}
a[x]=t;
}
void sort(int a[],int b[],int n)//实现将木棍按长和宽排序
{
int i,j,k,t,l;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<a[j])
k=j;
}
t=a[k];
a[k]=a[i];
a[i]=t;
l=b[k];
b[k]=b[i];
b[i]=l;
}
for(i=0;i<n-1;i++)
{
if(a[i]==a[i+1])
{
if(b[i]<b[i+1])
{
t=b[i];
b[i]=b[i+1];
b[i+1]=t;
}
}
}
}
还是萌新,不太懂便捷的函数,所以想要的功能都是自己写出的函数实现的。如果不懂得话可以问我哦。
上一篇: 十大排序算法(Java)