POJ-1065 Wooden Sticks (C语言)

有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;
			}
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值