荣耀笔试的一道题究竟 是我错了还是答案错了?
想问一下这道题,是我理解错了还是标答错了?:
部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑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; } }