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=
1na
i,然後計算 len
gt
hlength
length
是否能被4
整除,若不能,輸出false
。
若 l en
gt
hlength
length
能被4
整除,將所有的火柴降序排序,判斷最長的火柴 maxa
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...