贪心算法H题

这是一个关于木材加工优化问题的算法解析。给定一组木材,每根木材具有长度和重量属性,加工每根木材需要一定时间。如果下一根木材的长度和重量都大于等于前一根,则不需要额外设置时间。题目要求找到最小的总设置时间来加工所有木材。通过排序和双重循环,可以确定最小设置时间为2分钟,如示例所示。
摘要由CSDN通过智能技术生成

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).

Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, …, ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.

Output
The output should contain the minimum setup time in minutes, one per line.

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

题意

给你一些木料,木料有两个属性长度和重量,单独加工一根木料要1个单位时间,如果下一根木料的长度和重量都大于上一根木料,则不需要额外加工时间,否则增加1个单位时间。不管怎样,都是以上一次已经加工的木料作为下一次开始加工时的参考值。

思路

此题并不复杂,设辅助数组做标记,二重循环即可。
按其中一个属性升序排序,遍历数组,如果没加工过,则判断是否满足条件(长度和重量、未被加工),满足就加工这块木料标记它,不满足就继续往下比,比完后sum++;如果被加工过,则判断下一个是否被加工。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct wood{
    int len,wei;
}wd[5005];
bool pd[5005];
bool cmp(wood a,wood b){
    return a.len<b.len;
}
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>wd[i].len>>wd[i].wei;
            pd[i]=false;
        }
        sort(wd,wd+n,cmp);
        int sum=0;
        for(int i=0;i<n;i++){
            if(!pd[i]){
                int tlen=wd[i].len,twei=wd[i].wei;
                for(int j=i+1;j<n;j++){
                    if(wd[j].len>=tlen&&wd[j].wei>=twei&&!pd[j]){
                        tlen=wd[j].len;
                        twei=wd[j].wei;
                        pd[j]=true;
                    }
                }
                sum++;
            }
        }
        cout<<sum<<endl;
    }
}

当涉及到背包问时,贪心算法是一种常用的解决方法。在C语言中,可以使用贪心算法来解决背包问。下面是一个简单的C语言贪心算法背包问的代码示例: ```c #include <stdio.h> // 定义物品结构体 typedef struct { int weight; // 物品重量 int value; // 物品价值 } Item; // 贪心算法背包问函数 void knapsack(Item items[], int n, int capacity) { // 计算物品的性价比(价值除以重量) float ratios[n]; for (int i = 0; i < n; i++) { ratios[i] = (float) items[i].value / items[i].weight; } // 按照性价比排序物品 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (ratios[j] < ratios[j + 1]) { // 交换物品的位置 float tempRatio = ratios[j]; ratios[j] = ratios[j + 1]; ratios[j + 1] = tempRatio; Item tempItem = items[j]; items[j] = items[j + 1]; items[j + 1] = tempItem; } } } // 装入背包 int currentWeight = 0; float totalValue = 0; for (int i = 0; i < n; i++) { if (currentWeight + items[i].weight <= capacity) { // 将物品放入背包 currentWeight += items[i].weight; totalValue += items[i].value; } else { // 物品只能部分放入背包 int remainingWeight = capacity - currentWeight; totalValue += ratios[i] * remainingWeight; break; } } // 输出结果 printf("背包中物品的总价值为: %.2f\n", totalValue); } int main() { // 创建物品数组 Item items[] = { {10, 60}, {20, 100}, {30, 120} }; int n = sizeof(items) / sizeof(items[0]); // 物品数量 int capacity = 50; // 背包容量 // 调用贪心算法背包问函数 knapsack(items, n, capacity); return ; } ``` 这段代码实现了一个简单的贪算法背包问。它首先计算每个物品性价比,然后按照性价比对物品进行排序。接下来,它从性价比最高的物品开始,依次将物品放入背包,直到背包装满或者所有物品都放入背包。最后,输出背包中物品的总价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值