Doing Homework HDU - 1074

来源:http://www.cnblogs.com/hehe54321/archive/2017/10/06/hdu-1074.html
-Advertisement-
Play Games

Doing Homework HDU - 1074 題意: 有n個作業,每個作業有一個截止時間和完成所需時間,如果完成某個作業的時間超出了截止時間就扣完成時間-截止時間的分。求按怎樣的順序完成作業扣分最少。 方法:狀壓dp。ans[S]表示完成集合S的作業最少的扣分(集合S用一個數字表示)。pre[ ...


Doing Homework HDU - 1074

題意:

有n個作業,每個作業有一個截止時間和完成所需時間,如果完成某個作業的時間超出了截止時間就扣完成時間-截止時間的分。求按怎樣的順序完成作業扣分最少。

方法:狀壓dp。ans[S]表示完成集合S的作業最少的扣分(集合S用一個數字表示)。pre[S]和pre2[S]分別表示由前一個狀態到達狀態S完成的作業序號、S的前一個狀態。

首先應該意識到完成某個集合的作業,不管按照何順序,總時間都是一樣的。(曾經沒發現導致沒思路)

從小到大枚舉S(這樣的話枚舉到每個集合時其去掉某個作業得到的集合保證都已經枚舉到過,因為其子集的數字表示一定小於S)。

$ans[S]=min\{ans[S-p]+max(sumt[S]-d[p],0)\}$(p表示S集合內任意一項作業)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 typedef long long LL;
 7 char name[16][110];
 8 LL d[16],c[16],ans[70000];
 9 LL pre[70000],pre2[70000];
10 LL T,n,sumt;
11 vector<LL> vec;
12 int main()
13 {
14     LL i,j,t;
15     scanf("%lld",&T);
16     while(T--)
17     {
18         memset(name,0,sizeof(name));
19         memset(ans,0x3f,sizeof(ans));
20         memset(pre,0,sizeof(pre));
21         memset(pre2,0,sizeof(pre2));
22         scanf("%lld",&n);
23         for(i=1;i<=n;i++)
24             scanf("%s%lld%lld",name[i],&d[i],&c[i]);
25         ans[0]=0;
26         for(i=1;i<(1<<n);i++)
27         {
28             sumt=0;
29             for(j=1;j<=n;j++)
30                 if(i&(1<<(j-1)))
31                     sumt+=c[j];
32             for(j=1;j<=n;j++)
33                 if(i&(1<<(j-1)))
34                 {
35                     t=ans[i^(1<<(j-1))]+max(sumt-d[j],0LL);
36                     if(t<=ans[i])
37                     {
38                         ans[i]=t;
39                         pre[i]=j;
40                         pre2[i]=i^(1<<(j-1));
41                     }
42                 }
43         }
44         printf("%lld\n",ans[(1<<n)-1]);
45         vec.clear();
46         for(i=(1<<n)-1;i!=0;i=pre2[i])
47             vec.push_back(pre[i]);
48         for(i=vec.size()-1;i>=0;i--)
49             printf("%s\n",name[vec[i]]);
50     }
51     return 0;
52 }

某題解

一個裸狀態壓縮~

題目大意: 一共有N門作業,三個數據是作業的名字,到期時間,和完成需要天數,完成做也期限超過一天扣一分.問以什麼順序完成作業可以使扣得分最少.如果有相同的分數名字按字典序排序.

狀態轉移方程: dp[i]=min(dp[j]+hw[k]-hwlast[k])+hw[k];  j為i中去掉第k個作業的狀態,hw[k]為當前作業需要幾天完成,hwlast為當前作業完成期限為多少,若(dp[j]+hw[k]<hwlast[k])則取零,表示狀態不可用.

源代碼:

 

#include <myhead.h>

const int N=16;
const int M=110;
const int NUM=(1<<N);
struct HomeWork {
	char name[M];
	int last;
	int time;
};
struct Dp {
	int timer;
	int scr;
	int last;
	int i;
	void init() {
		this->timer=0;
		this->scr=INT_MAX;
		this->last=0;
		this->i=0;
	}
};
int n,num;
HomeWork hw[N];
Dp dp[NUM];

void init() {
	scanf("%d",&n);
	num=(1<<n);
	dp[0].init();
	dp[0].scr=0;
	for(int i=0;i<n;++i) {
		scanf("%s%d%d",hw[i].name,&hw[i].last,&hw[i].time);
	}
}

void work() {
	for(int i=1;i<num;++i) {
		dp[i].init();
		for(int j=n-1;j>=0;--j) {
			int s=(1<<j);
			if(s&i) {
				int past=i-s;
				int t=dp[past].timer+hw[j].time-hw[j].last;
				checkmax(t,0);
				t+=dp[past].scr;
				if(t<dp[i].scr) {
					dp[i].scr=t;
					dp[i].i=j;
					dp[i].last=past;
					dp[i].timer=dp[past].timer+hw[j].time;
				}
			}
		}
	}
	stack<int> s;
	int star=num-1;
	while(star) {
		s.push(dp[star].i);
		star=dp[star].last;
	}
	printf("%d\n",dp[num-1].scr);
	while(!s.empty()) {
		printf("%s\n",hw[s.top()].name);
		s.pop();
	}
}

int main() {
	int t;
	scanf("%d",&t);
	while(t--) {
		init();
		work();
	}
	return 0;
}


 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 單例模式顧名思義,就是只有一個實例,作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 單例模式的三個要點: 1.某個類只能有一個實例。 2.必須自行創建這個實例。 3.必須自行向整個系統提供這個實例。 為什麼要使用PHP單例模式? 1.PHP的應用有一個 ...
  • /* 需求:演示一個Hello World的Java小程式 思路: 1.定義一個類。因為Java程式都是定義在類中,Java程式都是以類的形式存在的,類的形式其實就是位元組碼的最終體現 2.定義一個主函數。可以讓該類可以獨立運行。 3.使用輸出語句。可以讓程式的運行結果顯示在控制臺上。 步驟: 1.定 ...
  • 1、MVC:非Java獨有,所有的B/S的結構都在使用它。 M——Model模式(自己寫代碼) V——View 視圖(jsp) C——Controller 控制器(Servlet) 2、JavaWeb三層框架 Web層-->與Web相關的內容(Servlet,JSP,Servlet相關API:req ...
  • 一、創建自定義標簽基本步驟 1、步驟 標簽處理類(標簽也是一個對象,那麼就需要先有類!) tld文件,它是一個xml 頁面中使用<%@taglib%>來指定tld文件的位置 2、標簽處理類 SimpleTag介面 void doTag():每次執行標簽時都會調用這個方法; JspTag getPar ...
  • Python 協程爬取妹子圖~~~ async aiohttp scrapy ...
  • 首先分析一下集合與數組的區別:1.java中的數組一般用於存儲基本數據類型,而且是靜態的,即長度固定不變,這就不適用於元素個數未知的情況;2.集合只能用於存儲引用類型,並且長度可變,適用於大多數情況,可用toArray()方法轉換成數組。 java語言提供了多種集合類的介面,如List、Set、Ma ...
  • 方法一: Toolkit.getDefaultToolkit().beep(); 方法二: System.out.println('\007');//八進位數 ...
  • package com.swift;//可以不要這句 import java.io.IOException; public class Shutdown100 { public static void main(String[] args) { try { Runtime.getRuntime().... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...