贪心算法J题

Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.

Input
The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.
Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework… Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced scores.

Output
For each test case, you should output the smallest total reduced score, one line per test case.

Sample Input
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
Sample Output
0
3
5

题意

作业有两个属性,最晚截止时间和未完成扣的分数。一天只能完成一门作业,如何安排做作业的顺序使扣分尽量少。

经典的截止时间问题

思路

设辅助数组,标记改天是否已使用。

先从扣分最多的开始,把他安排在最晚那天完成
如果那一天被占用,则减一天,再看是否占用
如果减为0,则必须要扣分了

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct work{
    int d,s;
}w[1005];
bool cmp(work a,work b){
    return a.s>b.s;
}
int date[1005];
int finddate(int x){
    if(date[x]==-1)return x;
    return finddate(date[x]);
}
int main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t,n,sum=0;
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>w[i].d;
        for(int i=0;i<n;i++){
            cin>>w[i].s;
            sum+=w[i].s;//总共要扣的分
        }
        sort(w,w+n,cmp);
        memset(date,-1,sizeof(date));
        for(int i=0;i<n;i++){
            int t=finddate(w[i].d);
            if(t>0){
                sum-=w[i].s;//减去不用扣的分
                date[t]=t-1;
            }
        }
        cout<<sum<<endl;
        sum=0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到背包问时,贪心算法是一种常用的解决方法。在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、付费专栏及课程。

余额充值