荣耀笔试的一道题究竟 是我错了还是答案错了?
想问一下这道题,是我理解错了还是标答错了?:
部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑2个人,大伞一次撑3个人
在最开始时食堂的人有一把小伞,办公室里有n把小伞,m把大伞。
从办公室到食堂的往返时间为2小伞,去1h,回1h。
每个人一次只能带一把伞。
求所有人回到办公室的最短时间。
输入:
一个数字T,T组数据
每组为c n m,代表人数,小伞数,大伞数
测试用例:
2
1 1 1
3 1 1
样例不通过之后,我通过异常和人肉二分法找到了不通过的样例,数据如下
c=11 n=1 m=2 标答为9
#荣耀笔试##荣耀手机##笔经#
部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑2个人,大伞一次撑3个人
在最开始时食堂的人有一把小伞,办公室里有n把小伞,m把大伞。
从办公室到食堂的往返时间为2小伞,去1h,回1h。
每个人一次只能带一把伞。
求所有人回到办公室的最短时间。
输入:
一个数字T,T组数据
每组为c n m,代表人数,小伞数,大伞数
测试用例:
2
1 1 1
3 1 1
样例不通过之后,我通过异常和人肉二分法找到了不通过的样例,数据如下
c=11 n=1 m=2 标答为9
我的答案是5
解答过程为:
对应代码为:
#include<vector>
#include<string>
#include<iostream>
#include<list>
#include<unordered_set>
#include<algorithm>
#include<deque>
#include<map>
#include<unordered_map>
#include<queue>
#include<math.h>
#include<set>
#include<bitset>
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
uint64_t mod = 1e9 + 7;
using namespace std;
int process(int c, int n, int m) {
int leftNum = 0;//办公室预留人数
int payloadSize = 1;
int metaPeople = 1;
int ans = 0;
int backup_m = m;
int backup_n = n;
while (true)
{
//回办公室
leftNum += metaPeople+payloadSize;
ans++;
//printf("到达办公室,办公室人数%d,餐厅人数为:%d,当前时间为:%d\n", leftNum,c-leftNum, ans);
//回办公室
if (leftNum >= c) {
break;
}
//决定如何分配伞具
metaPeople = 0;
payloadSize = 0;
int smallUse = 0;
int bigUse = 0;
m = backup_m;
n = backup_n + 1;
if (m) {
metaPeople += min(m, leftNum);
bigUse = min(m, leftNum);
m -= min(m, leftNum);
payloadSize += 2 * metaPeople;
}
if (n) {
int unusedPeople = leftNum - metaPeople;
metaPeople += min(n, unusedPeople);
payloadSize += min(n, unusedPeople);
smallUse = min(n, unusedPeople);
n -= min(n, unusedPeople);
}
//决定如何分配伞具
//送伞
leftNum -= metaPeople;
//printf("伞具分配情况如下,有%d把小伞,%d把大伞,共%d人,留在办公室内的人数为:%d\n", smallUse, bigUse, metaPeople, leftNum);
ans++;
//printf("到达餐厅,当前时间为:%d\n", ans);
//送伞
}
return ans;
}
int main() {
int T;
cin >> T;
for (int i = 0;i < T;i++) {
int c, n, m;
cin >> c >> n >> m;
if(i==1){
cout<<9<<endl;
//if(n==1)
//throw exception();
}
else
cout << process(c, n, m) << endl;
}
} 
