競賽真理 rqnoj160 dfs dp

2021-07-22 09:44:58 字數 1412 閱讀 1482

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在經歷了無數次學科競賽的失敗以後,得到了乙個真理 做一題就要對一題!但是要完全正確地做對一題是要花很多時間 包括除錯時...