练习题解第一次作业第 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

题目描述:求最小扣分数
第一行为测试个数,第i个测试中包括三行,第一行为作业科目数,第二行为deadline;第三行为完不成扣分数;
思路:
刚开始思路:这个题我刚开始的思路是先按照分数从小到大排序相同分数在按照deadline少的在前面,再根据时间进行筛选,排序后第i个作业完成的天数为d【i】,如果前面有d【i】+1个比d【i】小的就拿出这个作业并累加;反之则继续。在运行的时候按照这个思路写好代码感觉对了,但是就是运行不出来;后来通过检查发现还需要判断前面通过的作业中有没有达到他的饱和值;也就是说d【i】之前如果刚好有d【i】 则之前的安排不上其他的数值了。
正确思路:
首先按照天数排序从小到大,相同天数扣分多的在前,如果d【i】<i 则说明这几个数中已经超出期限,选出最小的进行扣除,直到循环结束。
代码如下:

#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<cstring>
#include <queue>
#include<iomanip>
using namespace std;

struct ch{
int day,score;
bool flag;
}arr[2000];
bool cmp(ch a,ch b)
{
    if(a.day!=b.day)
        return a.day<b.day;
    else
        return a.score>b.score;
}

int main()
{
 int t;
 cin>>t;
 while(t--)
 {
     int n;
     cin>>n;
     for(int i=1;i<=n;i++)
        cin>>arr[i].day;
     for(int i=1;i<=n;i++)
        {cin>>arr[i].score;arr[i].flag=false;}
        sort(arr+1,arr+1+n,cmp);
        int b=0,k=1;
        for(int i=1;i<=n;i++)
        {
            if(arr[i].day>=k)
            {
                k++;continue;
            }
            int a=arr[i].score,c;
            for(int j=1;j<=i;j++)
            {
                if(arr[j].score<=a&&!arr[j].flag)
                {
                    a=arr[j].score;
                    c=j;
                }

            }
b+=a;
            arr[c].flag=true;
        }


cout<<b<<endl;
 }

 }

在这串代码中***bool***类型起到了标记的作用,标记已经扣分的数组;

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨晓翔同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值