51Nod 3063 小明愛正方形 簡單題

2021-10-06 00:11:19 字數 2267 閱讀 5469

2. 解讀

3. **

time limit: 1000 ms

memory limit: 131072 kb

小明很喜歡正方形,也喜歡火柴,現在小明有一些火柴,現在小明想知道用所有的火柴棒能不能拼成乙個正方形。

第一行乙個數t

tt,表示資料的組數(1≤

t≤10)

(1 \le t \le 10)

(1≤t≤1

0);對於每組資料,

第一行輸入乙個數n

nn,表示火柴的數目,其中 1≤n

≤15

1 \le n\le 15

1≤n≤15

;第二行n

nn個數表示每根火柴的長度,其中火柴長度總和 ≤10

9\le 10^9

≤109

。對於每組資料輸出一行,如果所有的火柴可以拼成正方形,輸出true,否者輸出false

151

1222

true
51nod 3063 小明愛正方形

設火柴長度為 a

ia_i

ai​,首先對所有的火柴進行求和,得到 len

gth=

∑i=1

na

ilength = \sum_^n a_i

length

=∑i=

1n​a

i​,然後計算 len

gt

hlength

length

是否能被4整除,若不能,輸出false

若 l en

gt

hlength

length

能被4整除,將所有的火柴降序排序,判斷最長的火柴 max⁡a

i\max a_i

maxai​

是否大於 len

gt

hlength

length

,若是,輸出false

若不是,假設當前還需要的邊長長度為 buf

fe

rbuffer

buffer

,對所有的火柴進行4次降序遍歷,如果火柴長度 ai≤

buff

er

a_i \le buffer

ai​≤bu

ffer

,則該火柴被選取,buf

fer=

buff

er−a

ibuffer = buffer - a_i

buffer

=buf

fer−

ai​,並將 a

ia_i

ai​ 置為0

如果每次遍歷完以後 buf

fe

rbuffer

buffer

都為0,即4條邊都被火柴拼湊出來了,則輸出true,否則輸出false

#include

#include

#include

using

namespace std;

const

int num =15;

// 儲存

long

long list[num]

;// 定義降序排序規則

bool

cmp(

long

long a,

long

long b)

intmain()

// 降序排序

sort

(list, list + n, cmp)

;// 計算

// 若不能分為4條邊

if(sum %4!=

0|| list[0]

> sum /4)

else}}

// 若不能用火柴湊出需要的邊長

if(buffer >0)

}}// 輸出

printf

("%s\n"

, flag ?

"true"

:"false");

}}

github:

51nod 1065 最小正子段和

1065 最小正子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 從中選出乙個子串行 a i a i 1 a j 使這個子串行的和 0,並且這個和是所有和 0的子串行中最小的。例如 4,1,5,2,1,2,6...

51nod 1065 最小正子段和

求字首和,然後公升序排序。排序後相鄰兩個字首和只差越小,比如prefixsum i 1 假設他原來座標是n,和prefixsum i 假設他原來座標是m,他倆差越小,則表明區間 m,n 之間的正整數和越小,前提是n m。還有排序的時候如果有多個字首和相等,則把下標大的放在前邊,下標小的放後邊。比如輸...

51nod 1065 最小正子段和

1065 最小正子段和 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 從中選出乙個子串行 a i a i 1 a j 使這個子串行的和 0,並且這個和是所有和 0的子串行中最小的。例如 4,1,5,2,1,2,6...