欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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
思路:先按长度从大到小排列(连带着宽度),如果长度相同再按宽度从大到小交换位置。然后从比较的那根木棍(先是第一根)往后找,若有长和宽(小棍)都小于或等于这根的,就将(小棍)提到这根后面。依次这样,若没有这样的(小棍)则最短时间加一。
总体是贪心,先以比较的木棍为基准再从后找,看有没有长宽都小于它的。(以一个·为基准找另一个)
例如输入样例最终木棍的顺序如下图:
POJ-1065 Wooden Sticks (C语言)
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;
			}
		}
	}
}

还是萌新,不太懂便捷的函数,所以想要的功能都是自己写出的函数实现的。如果不懂得话可以问我哦。