tenshi在經歷了無數次學科競賽的失敗以後,得到了乙個真理:做一題就要對一題!但是要完全正確地做對一題是要花很多時間(包括除錯時間),而競賽的時間有限。所以開始做題之前最好先認真審題,估計一下每一題如果要完全正確地做出來所需要的時間,然後選擇一些有把握的題目先做。 當然,如果做完了預先選擇的題目之後還有時間,但是這些時間又不足以完全解決一道題目,應該把其他的題目用貪心之類的演算法隨便做做,爭取「騙」一點分數。根據每一題解題時間的估計值,確定一種做題方案(即哪些題目認真做,哪些題目騙」分,哪些不做),使能在限定的時間內獲得最高的得分
第一行有兩個正整數n和t,表示題目的總數以及 競賽的時限(單位秒)。以下的n行,每行4個正整數w1i 、t1i 、w2i 、t2i ,
分別表示第i題:完全正確做出來的得分,完全正確做出來所花費的時間(單位秒),「騙」來的分數,「騙」分所花費的時間(單位秒)。其中,3 ≤n ≤30,2 ≤t ≤ 1080000,1 ≤ w1i 、w2i ≤ 30000,1 ≤ t1i 、t2i ≤ t。
直接把所能得到的最高分值輸出
兩種解法(其實因該是三種才對)
dp:f[i
]=max(f[
i−1]
[j−w
i1]+
vi1,
f[i−
1][j
−wi2
]+vi
2,f[
i−1]
[j])
dfs:按照分數與時間的比值排序,剪枝:如果之後所有題目全做仍不能達到更高分就退
dfs:分成兩半搜,然後二分答案,類似買汽水
dp應該可以離散一下,但是開o2可以過也就算了
#include
using namespace std;
int f[1080001];
__attribute__((optimize("o2")))
int max(int
x,int
y)__attribute__((optimize("o2")))
int main()
}printf("%d\n",f[m]);
return
0;}
#include
#include
using namespace std;
struct obj
t[31];
int n,m,ans=0;
bool cmp(obj x,obj y)
void dfs(int dep,int sum,int left)
int main()
; }
sort(t+1,t+n+1,cmp);
dfs(1,0,m);
printf("%d\n",ans);
return
0;}
rqnoj 1 去重 排序
題目描述 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 ...
RQNOJ 1 明明的隨機數
ide codeblocks 題目 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查...
SSL P1377 競賽真理 題目
競賽真理 time limit 1000ms memory limit 65536k total submit 449 accepted 164 description tenshi在經歷了無數次學科競賽的失敗以後,得到了乙個真理 做一題就要對一題!但是要完全正確地做對一題是要花很多時間 包括除錯時...