程式設計思維與實踐 Week3 作業

2021-10-03 23:40:21 字數 2453 閱讀 9861

給定n個正數,從中選出k個數,令其和為s,求選數的方案數。

對於每乙個數選擇與不選擇都進行dfs

邊界條件:

選中k個數且和為s

選中數的個數大於k

選中數的和大於s

要選的數越界了

#include

using

namespace std;

int ans =0;

int a[

2000];

int n,k,s;

void

choice

(int i,

int sum,

int chosen)

if(i >= n || sum <

0|| chosen > k)

return

; chosen++

;choice

(i+1

, sum - a[i]

, chosen)

; chosen--

;choice

(i+1

, sum, chosen);}

intmain()

return0;

}

數軸上有 n

nn 個閉區間[ai

,bi]

[a_i, b_i]

[ai​,b

i​]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)

對於每乙個區間按區間的右端點進行公升序排序,隨後進行遍歷,對於遍歷到第乙個左端點大於當前選中區間的右端點時,選中當前遍歷區間,並對ans++,繼續遍歷。

本題使用了貪心策略:每次取當前未被覆蓋區間中右端點最前的區間的右端點。

#include

using

namespace std;

struct edge edges[

200]

;bool

cmp(edge e1, edge e2)

intmain()

sort

(edges, edges + n, cmp)

;int ans =

1, cho =0;

for(

int i =

1; i < n; i++)}

cout << ans << endl;

return0;

}

數軸上有 n(1

<=n

<

=25000

)n (1<=n<=25000)

n(1<=n

<=2

5000

)個閉區間 [ai

,bi]

[a_i, b_i]

[ai​,b

i​],選擇盡量少的區間覆蓋一條指定線段 [1,

t](1

<=t

<=1

,000

,000

)[1, t]( 1<=t<=1,000,000)

[1,t](

1<=t

<=1

,000

,000

)。覆蓋整點,即(1,

2)+(

3,4)

(1,2)+(3,4)

(1,2)+

(3,4

)可以覆蓋(1,

4)

(1,4)

(1,4)。

不可能辦到輸出−1-1

−1將所有區間按照左端點公升序排序,在每次選取區間時都固定乙個起點,遍歷區間尋找左端點小於起點的區間中右端點-起點的長度最長的區間,並以這個區間的右端點作為新的起點。

細節: 由於只需覆蓋整點,所以在遍歷區間時尋找左端點小於起點+opop

op的區間,opop

op在第一輪遍歷時為0,之後置為1。

#include

#include

#include

#include

using

namespace std;

int n,t;

struct edge edges[

1000000];

bool

cmp(edge e1, edge e2)

void

solve()

int len =0;

for(

; i < n; i++)}

else

break;}

if(len ==0)

else

op =1;

}}intmain()

sort

(edges, edges + n, cmp)

;solve()

;memset

(edges,0,

sizeof

(edges));

}return0;

}

程式設計思維與實踐 Week3 作業

b 區間選點 貪心 c 區間覆蓋問題 貪心 給出n個正數,從其中選出k個數,使其總和為s,問 有多少種選數方案?input 第一行是正數t t 100 表示測試的組數。每一組都輸入兩行,第一行是三個整數n,k,s,第二行是n個正整數。output 每一組輸出結果佔一行,為方案的數目。sample i...

程式設計思維與實踐 week3

題目 題意 給定n個正整數,要求選出k個數,使選出來的k個數和為sum,共有多少個方案?輸入 第一行乙個數t t 100 表示有t組測試資料。接下來的兩行,一行有三個數n,k,s,一行有n個正整數。輸出 每組資料輸出乙個和為s的方案個數,每組佔一行。思路 dfs 可行性剪枝 子集列舉問題。列舉所有子...

程式設計思維與實踐 Week3 作業 B區間選點

題意 數軸上有n個閉區間,在數軸上選取盡量少的點,使得每個區間上都有乙個點,其中乙個點可以覆蓋多個區間。思路 將各個點用結構體記錄下來,分別記錄下左右邊界。不妨設左端點為a,右端點為b。對這些點進行排序,然後將區間按b 從小到大排序 b 相同時a 從大到小排序 然後從前往後進行選點,點為選擇前乙個區...