AcWing 1603 整數集合劃分(簡單貪心)

2021-10-17 14:20:56 字數 1599 閱讀 2798

題目鏈結

給定乙個包含 n 個正整數的集合,請你將它們劃分為兩個不相交的集合 a1 和 a2,其中 a1 包含 n1 個元素,a2 包含 n2 個元素。

用 s1 表示集合 a1 內所有元素之和,s2 表示集合 a2 內所有元素之和。

請你妥善劃分,使得 |n1−n2| 盡可能小,並在此基礎上 |s1−s2| 盡可能大。

輸入格式

第一行包含整數 n。

第二行包含 n 個正整數。

輸出格式

再一行中輸出 |n1−n2| 和 |s1−s2|,兩數之間空格隔開。

資料範圍

2≤n≤105,

保證集合中各元素以及所有元素之和小於 231。

輸入樣例1:

10238

1099

462333461

666555

輸出樣例1:

0

3611

輸入樣例2:

13

11079

21869

3721

10029

1352613

5188

85

輸出樣例2:

1

9359

題意:

使得兩個集合的個數盡量的小,然後在那個基礎上使得兩個集合的差最大

思路:集合個數盡量的小—>不是 0 就是 1 ( 偶數 or 奇數

差最大—> 乙個將所有最小的 n / 2 個數包攬, 另乙個將剩餘的最大的數包攬, 相減即可

答案:

#include

#include

#define ll long long

#define inf 0x3f3f3f3f

const

int mod =10;

const

int n =

1e5+10;

const

int m =

1111

;using

namespace std;

int a[n]

;void

solve()

sort

(a+1

,a+1

+n);

for(

int i=

1;i<=n/

2;i++

) sum1+

=a[i]

;for

(int i=n;i>n/

2;i--

) sum2+

=a[i];if

(n%2

) cout<<

1<<

" "

0<<

" "<}int

main()

Acwing 900 整數劃分

乙個正整數n可以表示成若干個正整數之和,形如 n n1 n2 nk,其中n1 n2 nk,k 1。我們將這樣的一種表示稱為正整數n的一種劃分。現在給定乙個正整數n,請你求出n共有多少種不同的劃分方法。輸入格式 共一行,包含乙個整數n。輸出格式 共一行,包含乙個整數,表示總劃分數量。由於答案可能很大,...

AcWing 900 整數劃分

題目描述 乙個正整數n可以表示成若干個正整數之和,形如 n n1 n2 nk,其中n1 n2 nk,k 1。我們將這樣的一種表示稱為正整數n的一種劃分。現在給定乙個正整數n,請你求出n共有多少種不同的劃分方法。輸入格式 共一行,包含乙個整數n。輸出格式 共一行,包含乙個整數,表示總劃分數量。由於答案...

AcWing 2068 整數拼接

原題鏈結 考察 列舉 hash 思路 暴力是直接列舉a i 與a j 需要優化省去一重迴圈.我們列舉的a i a j 檢查是否為k倍數時,需要讓a j 10t a i t位為a i 的位數,注意這裡用字串轉換反而不如直接求位數方便 一重迴圈列舉a i 時,t已知,a i 已知,剩下的是快速找符合條件...