zoukankan      html  css  js  c++  java
  • 贪心初步 hdu1789 Doing Homework again

    一道非常经典的题目

    题目地址

    题目大意

    给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案。

    正确的策略是:

    1. 扣除分数大的先做
    2. 扣除分数相同,先截止的先做
    3. 做一件事的时候,从截止时间开始向第一天遍历,如果当天没有被作业占据则标记为占据。做这件事的日期越大越好。
    4. 如果不能满足3的条件,则为不能完成
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string>
     4 #include <string.h>
     5 
     6 #define MAX 1010
     7 
     8 using namespace std;
     9 int V[MAX];
    10 int E[MAX];
    11 bool t[MAX];
    12 int order[MAX];
    13 
    14 void init()
    15 {
    16     memset(t,0,MAX * sizeof(bool));
    17     return ;
    18 }
    19 
    20 bool cmpA (int a ,int b)
    21 {
    22     if(V[a] > V[b])
    23     {
    24         return 1;
    25     }
    26     else if(V[a] == V[b] && E[a] < E[b])
    27     {
    28         return 0;
    29     }
    30     else 
    31         return 0;
    32 }
    33 
    34 int main()
    35 {
    36     int T;
    37     while(~scanf("%d",&T))
    38     {
    39         for (int i = 0; i < T; ++i)
    40         {
    41             init();
    42             int N;
    43             int All = 0;
    44             int ans = 0;
    45             scanf("%d",&N);
    46             for (int j = 0; j < N; ++j)
    47             {
    48                 scanf("%d",&E[j]);
    49             }
    50             for (int j = 0; j < N; ++j)
    51             {
    52                 scanf("%d",&V[j]);
    53                 All = All + V[j];
    54                 order[j] = j;
    55             }
    56             //////////////////////////
    57             sort(order,order + N,cmpA);
    58             /////////////////////////////
    59             //////////////////////////////
    60             for (int j = 0; j < N; ++j)
    61             {
    62                 int event = order[j];
    63                 bool flag = 0;
    64                 for (int k = E[event]; k >= 1; k--)
    65                 {
    66                     if(!t[k])
    67                     {
    68                         ans = ans + V[event];
    69                         t[k] = 1;
    70                         flag = 1;
    71                     }
    72                     if(flag) break;
    73                 }
    74             }
    75             ///////////////////////////
    76             cout << All - ans << endl;
    77 
    78         }
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    ISAPI Extension和ISAPI Filter
    Windows Debugging之二
    Windows Debugging之三
    举例一些可执行文件的后缀名
    Windows Debugging 之一
    [转]C# 日期函数
    在DataGridView中的CellEndEdit事件中删除当前行报错
    一个奇怪的问题
    [转载]如何发送和接收 Windows Phone 的 Toast 通知
    【转载】如何播放 Windows Phone 的后台音频
  • 原文地址:https://www.cnblogs.com/ticsmtc/p/4969559.html
Copyright © 2011-2022 走看看