zoukankan      html  css  js  c++  java
  • Doing Homework

    有n个任务,每个任务有一个截止时间,超过截止时间一天,要扣一个分。
    求如何安排任务,使得扣的分数最少。Input有多组测试数据。第一行一个整数表示测试数据的组数
    第一行一个整数n(1<=n<=15)
    接下来n行,每行一个字符串(长度不超过100)表示任务的名称和两个整数,分别表示任务的截止时间和完成任务需要的天数。 这n个任务是按照字符串的字典序从小到大给出。 Output每组测试数据,输出最少扣的分数的。 并输出一个完成任务的方案,如果有多个方案,输出字典序最小的一个。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 struct node{
     7     int sumT;
     8     int val;
     9     int pre;
    10 };
    11 node dp[(1<<15)];
    12 const int INF = 1e9;
    13 const int MAX = 20;
    14 int ddls[MAX];
    15 int Ts[MAX];
    16 char names[MAX][100];
    17 int order[16];
    18 int calc(int x){
    19     int cnt = 0;
    20     while(x){
    21         cnt++;
    22         x >>= 1;
    23     }
    24     return cnt-1;
    25 }
    26 int main(){
    27     int T;scanf("%d",&T);
    28     while(T--){
    29         for(int i = 0;i < (1<<15);i++){
    30             dp[i].val = INF;
    31         }
    32         int n;
    33         scanf("%d",&n);
    34         for(int i = 0;i < n;i++){
    35             scanf("%s %d%d",names[i],&ddls[i],&Ts[i]);
    36         }
    37         dp[0].pre = 0;
    38         dp[0].sumT = 0;
    39         dp[0].val = 0;
    40         for(int S = 0;S < (1<<n);S++){
    41             for(int i = 0;i < n;i++){
    42                 if((S & (1<<i)) == 0){
    43                     int tar = S|(1<<i);
    44                     int cost = 0;
    45                     if(dp[S].sumT + Ts[i] > ddls[i])
    46                         cost = dp[S].sumT + Ts[i] - ddls[i];
    47                     if(dp[tar].val > dp[S].val + cost ){
    48                         dp[tar].val = dp[S].val + cost;
    49                         dp[tar].sumT = dp[S].sumT + Ts[i];
    50                         dp[tar].pre = S;
    51                     }
    52                 }
    53             }
    54         }
    55         cout<<dp[(1<<n)-1].val<<endl;
    56         int S = (1<<n)-1;
    57         int cnt = n;
    58         while(S){
    59             int nS = dp[S].pre;
    60             int t = calc(nS ^ S);
    61             order[--cnt] = t;
    62             S = nS;
    63         }
    64         for(int i = 0;i < n;i++)
    65         {
    66             cout<<names[order[i]]<<endl;
    67         }
    68     }
    69     return 0;
    70 }
  • 相关阅读:
    JS 删除web sql 数据表
    JS 新建web sql 数据表
    JS 更新web sql 数据表的数据
    JS 删除一行web sql 数据表的数据
    JS 向web sql数据表插入数据
    JS 打开or连接web sql数据库
    JS 获取表单数据存入数组
    JS 限制小数点位数
    JS 通过id获取DOM对象--减少代码
    mvc “System.NullReferenceException”类型的异常在 App_Web_zo44wdaq.dll 中发生,但未在用户代码中进行处理 其他信息: 未将对象引用设置到对象的实例。
  • 原文地址:https://www.cnblogs.com/lhsghhqgmzy/p/11277461.html
Copyright © 2011-2022 走看看