这是问题
在Infinite House of Pancakes,只有有限的煎饼,但是有无数的食客愿意吃它们!当餐厅开放供应早餐时,在无限多的食客中,正好D有非空盘子;其中的第i个在他或她的盘子上有Pi煎饼。其他人都有一个空盘子。
通常,每一分钟,每个有非空盘子的用餐者都会从他或她的盘子里吃一个煎饼。但是,有些时间可能很特别。在一个特殊的时刻,头部服务器要求用餐者。注意,选择带有非空盘子的用餐者,小心地将一些煎饼从用餐盘上取下,然后将这些煎饼移到另一个餐馆(空的或非空的)盘子上。没有食客在特殊时刻吃东西,因为这样会很粗鲁。
你是今天早上值班的头部服务员,你的工作是决定哪些会议纪要,特别是哪些,以及哪些煎饼会搬到哪里。也就是说,每分钟,你都可以决定要么什么都不做,让食客吃饭,或宣布一个特殊的时间,并打断用餐者做一个或多个煎饼的单一动作,如上所述。
当没有剩余的煎饼可以吃时,早餐就结束了。你能多快实现这一目标? 输入
输入的第一行给出了测试用例的数量,T。T测试用例如下。每个包含一条带有D的线,带有非空盘的用餐者的数量,接着是另一条带有D空格分隔整数的线,表示这些用餐者的煎饼数量。板。 输出
对于每个测试用例,输出一行包含" Case #x:y",其中x是测试用例编号(从1开始),y是完成早餐所需的最小分钟数。 限制
1≤T≤100。 小数据集
1≤D≤6。 1≤Pi≤9。 大数据集
1≤D≤1000。 1≤Pi≤1000。
样品
输入
3
1
3
4
1 2 1 2
1
4
输出
Case #1: 3
Case #2: 2
Case #3: 3
这是我的源代码
int result = 0, D = 0;
int part(vector<int> v1) {
if(v1[D - 1] == 0)
return 0;
int t1 = 0, t2 = 0, t3 = 0, i = 0;
vector<int> v2;
for(i = 0; i < D; ++i)
if(v1[i])
v2.push_back(v1[i] - 1);
else
v2.push_back(0);
if(v1[D - 1] == 1)
v1[D - 1] = 0;
else if( v1[D-1] % 2 )
v1[ D- 1 ] = ( v1[D-1] / 2 ) + 1;
else
v1[ D -1 ] = v1[ D - 1 ] / 2;
sort(v1.begin(),v1.end());
t1 = 1 + part(v1);
t2 = 1 + part(v2);
t3 = min(t1,t2);
return t3;
}
int main(void) {
int T = 0, count = 0;
scanf("%d",&T);
while(T--) {
vector<int> v1;
vector<int> ::iterator it;
int i = 0, temp = 0; D = 0;
result = 0;
++count;
scanf("%d",&D);
for(i = 0; i < D; ++i) {
scanf("%d",&temp);
v1.push_back(temp);
}
sort( v1.begin(), v1.end() );
result = part(v1);
printf("Case #%d: %d\n",count,result);
}
return 0;
}