zoukankan      html  css  js  c++  java
  • ACM Doing Homework again

    Ignatius刚刚从第30届ACM / ICPC回到学校。现在他有很多作业要做。每个老师给他一个截止作业的截止日期。如果Ignatius在截止日期之后进行了家庭作业,老师将减少他的最终考试成绩。现在我们假设做每个老师的作业总是需要一天的时间。以Ignatius希望你帮他安排做作业的顺序来减少分数的减少。

    输入

    每个测试用例从正整数N(1 <= N <= 1000)开始,表示作业数。然后两行。 第一行包含N个整数,表示作业的期限,下一行包含N个整数,表示减少的分数。
    输出

    对于每个测试用例,应该输出减少的最小总分数,每个测试用例一行。

    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
    Ignatius比赛回来之后,每位老师给Ignatius一个交作业的最后期限,如果交不上去就扣分。每门作业都要一天时间完成,求最少扣多少分。先输入一个T表示有T组测试数据,接下来每组数据先输入一个N,代表有N个作业,然后输入两行,第一行表示每门作业要交的日期,第二行表示对应的如果不交这门作业要扣的分数。输出要扣的最少分数。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node{
     4     int dayline;
     5     int descore;
     6     bool flag;
     7 }homework[1005];
     8 bool cmp(node a,node b)
     9 {
    10     if(a.dayline!=b.dayline)
    11         return a.dayline < b.dayline;  /*按期限从短到长排序*/
    12     else
    13         return a.descore>b.descore;  /*如果期限相同,按被扣分数从高到低来排序*/
    14 }
    15 
    16 int main()
    17 {
    18     int t,n,temp;
    19     while(cin>>t)
    20     {
    21         while(t--)
    22         {
    23             scanf("%d",&n); /*作业的数量*/
    24             for(int i = 0; i < n; i++)  /*读取作业的期限*/
    25                 scanf("%d",&homework[i].dayline);
    26             for(int i = 0; i < n; i++) /*读取未完成作业被扣除的分数*/
    27             {
    28                 scanf("%d",&homework[i].descore);
    29                 homework[i].flag = true; /*标记可完成*/
    30             }
    31 
    32             sort(homework,homework+n,cmp);
    33             int ans = 0; /*统计被扣除的分数*/
    34             int day = 1; /*截止日期*/
    35             for(int i = 0; i < n; i++)
    36             {
    37                if(homework[i].dayline >= day)
    38                    day++;
    39                 else{
    40                     int p = homework[i].descore;
    41                     int temp = i;
    42                     for(int j =0; j < i; j++)  /*往前面搜索,查找是否有被扣分数较小的*/
    43                         if(homework[j].descore < p && homework[j].flag) /*被扣分数较少 并且是可完成的(用来完成被扣分较大的作业)*/
    44                         {
    45                             p = homework[j].descore;
    46                             temp = j;
    47                         }
    48 
    49                     ans += p;
    50                     homework[temp].flag = false;  /*标记不可完成*/
    51                 }
    52 
    53 
    54             }
    55             cout<<ans<<endl;
    56         }
    57     }
    58     return 0;
    59 }
  • 相关阅读:
    跃迁方法论 Continuous practice
    EPI online zoom session 面试算法基础知识直播分享
    台州 OJ 2648 小希的迷宫
    洛谷 P1074 靶形数独
    洛谷 P1433 DP 状态压缩
    台州 OJ FatMouse and Cheese 深搜 记忆化搜索
    台州 OJ 2676 Tree of Tree 树状 DP
    台州 OJ 2537 Charlie's Change 多重背包 二进制优化 路径记录
    台州 OJ 2378 Tug of War
    台州 OJ 2850 Key Task BFS
  • 原文地址:https://www.cnblogs.com/jj81/p/7381879.html
Copyright © 2011-2022 走看看