description
ds最近剛學會了揹包。比如,給乙個序列,問是否存在乙個子集滿足元素和為x ,
ds 會用一種方法:
int dp[x+1];
dp[0] = 1;
for (int i = 0 ;i < n ; ++i)
for (int j = 0 ; j < x ; ++j)
if (dp[j] && j+a[i] <= x) dp[j + a[i]] = 1;
return dp[x];
xiaodao
覺得ds
非常聰明,不過她想難為一下ds。
她給了ds
乙個序列,序列中有n(
n ≤10
7)個正整數,滿足1≤
a1,ai
≤ai+1,ai≤
109然後她讓
ds求這個序列的
「最小不可構造數
」,也就是最小的
y 使得
y 不能表示為序列的某個子集中所有元素的和。
input
第一行是乙個整數
t 代表資料組數,以下是
t 組資料。
每組資料第一行乙個整數
n 代表本組資料一共有
n 個整數。
第二行n
個整數ai滿足
1≤a1
,ai≤a
i+1,ai≤
109所有的n
加起來的和小於107
output
對於每組資料,輸出乙個整數
y 代表本組資料的最小不可構造數。
sample input
331 2 4
22 100000
41 2 3 4
sample output
8111
hint
對於第一組樣例
1 = 1 , 2 = 2 , 3 = 1 + 2 , 4 = 4 , 5 = 1 + 4 , 6 = 2 + 4 , 7 = 1 + 2 + 4
對於第三組樣例
1 = 1 , 2 = 2 , 3 = 1 + 2 = 3 , 4 = 4 = 1 + 3 , 5 = 1 + 4 = 2 + 3 , 6 = 2 + 4 = 1 + 2 + 3 , 7 = 1 + 2 + 4 , 8 = 1 + 3 + 4 , 9 = 2 + 3 + 4 , 10 = 1 + 2 + 3 + 4
一開始以為是dp,後來想了下,但是由於數目太大而不好dp,後來想了下,只要前面的和+1達不到後面的那個數的話,那麼前面得到的sum+1就是答案了。。。
#include #include #include using namespace std;
int a[10000005];
int main()
{ int i,j,n,t;
long long sum;
scanf("%d",&t);
while(t--)
{sum = 0;
scanf("%d",&n);
for(i = 0;i
哈爾濱理工大學軟體學院ACM程式設計全國邀請賽
簡單做個記錄,因為賬號登不上了。想看 的請繞行 a 網路流。被自己估計的記憶體和時間嚇住了mdzz。b 一上來就開了這道題 c 自己讀錯題目了,簡直zz。dp i j k dp i j k 表示用j j 個硬幣得到1 i role presentation style position relati...
哈爾濱理工大學2016新生賽K題
小明這個人特別無聊,他喜歡把乙個字串以乙個奇怪的姿勢壓縮起來。他會把連續的字元表示成字元和數字的形式,而且他用的數字還都是一位的!比如下面這個例子 a12 表示的是 aaaa 也就是說壓縮後的字串裡的每個數字表示重複最後乙個出現的字元數字次,就好像上面的例子。現在給你一些被無聊的小明壓縮過的字串,你...
哈爾濱理工大學2016新生賽I題
這次我們要寫乙個簡單的行編輯器,當按下 時代表按下了一次退格符,當按下 時代表乙個退行符 使當前行的字元全部無效 例如,假設從終端接收了這樣的兩行字元 whil lr e s s outcha putchar s 則實際有效的是下列兩行 while s putchar s 請你編寫乙個程式,輸出實際...