ZOJ1025-WooDENSTICKS
现有n根木棒,已知它们的长度和重量。要用一部木工机一根一根地加工这些木棒。该机器加工过程中需要一定的准备时间,是用于清洗机器,调整工具和木板的。
木工机需要的准备时间如下:
(1)第一根木棒需要1min的准备时间;
(2)在加工了一根长为L,重为W的木棒之后,接着加工一根长为L~(L<=L ~),重为W ~(W<=W ~)的木棒是不需要任何准备时间的,否则需要一分钟的准备时间。
给定n根木棍,找到最少的准备时间。
【例如】现在有长和重分别为(4,9),(5,2),(2,1),(3,5)和(1,4)的五根木棒,那么所需准备的最小为2min,顺序为(1,4),(3,5)
(4,9),(2,1),(5,2)
输入:输入有多组测试事例。输入数据的第一行是测试例的个数T。每个测试例两行:第一行是一个整数n(1<=n<=5000),表示有多少根木棒;第二行包括n*2个整数,表示l1,w1…
输出:输出是已分钟为单位的最少准备时间,一行一个。
解:采用结构体表示木棒的信息:
#define maxN5001
struct stick
{
int l,w;
};
stick data[maxN];
按木棒的长度进行排序,sort(data,data+n,cmp);
排序函数cmp()的实现
int cmp(stick a,stick b)
{
if(a.l==b.l) return a.w<b.w;
if(a.l<b.l) return true;
else return false;
}
#include <bits/stdc++.h>
#define max 5001
typedef struct{
int length, weight;
}boat;
boat b[max];
int count = 0;
using namespace std;
void sort_length(int n){
//排序算法
int i, j;
boat x;
for(i=1; i<=n; i++){
for(j=1; j<=n-i; j++){
if(b[j].length >= b[j+1].length){
x = b[j];
b[j] = b[j+1];
b[j+1] = x;
}
}
}
}
void sort_weight(int n){
boat x;
int i=1, j=1, p=0;
int k, s;
//同一长度内进行排序
for(i=1; i<=n; i++){
x = b[i];
j = i+1;
while(b[i].length == b[j].length){
j++;
}
p = 0;
for(k=i; k<j; k++){
for(s=i; s<j-p-1; s++){
if(b[s].weight >= b[s+1].weight){
x = b[s];
b[s] = b[s+1];
b[s+1] = x;
}
}
p++;
}
i = j-1;
}
for(i=1; i<=n; i++){
printf("%d %d\n", b[i].length, b[i].weight);
}
//
for(i=1; i<=n; i++){
k=i;
for(j=i+1; j<=n; j++){
if(b[i].length == b[j].length){
i = j;continue;
}
if(b[i].weight <= b[j].weight){
i = i+1;
x = b[j];
for(s=j; s>i; s–){
b[s] = b[s-1];
}
b[i] = x;
}
}
count++;
printf("\n每一次加工的木棒\n");
for(; k<=i; k++){
printf("%d %d\n", b[k].length, b[k].weight);
}
}
printf("\n总共所需要的时间:%dmin\n", count);
}
int main(){
int n;
int i;
printf(“请输入木棒总数:”);
scanf("%d", &n);
printf(“请输入木棒的长度和重量:”);
for(i=1;i<=n;i++){
scanf("%d%d", &b[i].length, &b[i].weight);
}
printf(“先按照长度进行排序。\n”);
sort_length(n);
for(i=1; i<=n; i++){
printf("%d %d\n", b[i].length, b[i].weight);
}
printf("\n再在排好序的基础上按照重量排序。\n");
sort_weight(n);
return 0;
}