荣耀笔试的一道题究竟 是我错了还是答案错了?

想问一下这道题,是我理解错了还是标答错了?:


部门聚餐,下大雨,要将所有人从食堂运到办公室。
现在由大伞和小伞,小伞一次撑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;
	}
}


#荣耀笔试##荣耀手机##笔经#
全部评论
我的程序跑出来也是5.因为两个人过去的时候每个人打一把,手里在带一把,这样的话3把伞全过去了,然后一次性就可以带回来8个人,这样再来一次就可以了共5次
1 回复
分享
发布于 2021-09-28 20:45
2题,我用的py,输入输出搞不定,气死我了
1 回复
分享
发布于 2021-09-28 21:03
小红书
校招火热招聘中
官网直投
答案错了,答案不会没有考虑可以用小伞换大伞吧?
点赞 回复
分享
发布于 2021-09-28 20:57
同结果5 一个点都没过去😭
点赞 回复
分享
发布于 2021-09-28 21:00
答主能贴下第一题的代码或者思路吗?第一题“双回文串判断”我过了60%,不知道哪些边界条件没有过
点赞 回复
分享
发布于 2021-09-28 21:06
我也是5.。。 int usen = 1; //用的小伞 int usem = 0;//用的大伞 int time1= 1;//时间 void func(int c, int n, int m) { if (c <= 0) return ; int backp = 2 * usen + 3 * usem; if (c - backp <= 0) return; if (m <= backp) {//大伞少于人数 usem = m; if (backp - m < n)  usen = backp - m;  else usen = n; } else {//大伞多于人数 usem = backp;  //伞数 = 人数 usen = 0; } time1+= 2; func(c - backp, n, m); } int main() { int n; cin >> n; vector<vector<int>> useVector; while (n--) { vector<int> tempVector; int c, n, m; cin >> c >> n >> m; tempVector.push_back(c); tempVector.push_back(n); tempVector.push_back(m); useVector.push_back(tempVector); } vector<int> result; for (int i = 0; i < useVector.size(); i++) { func(useVector[i][0], useVector[i][1] + 1, useVector[i][2]); result.push_back(time1); time1 = 1; } for (auto i : result) { cout << i << endl; } return 0; }
点赞 回复
分享
发布于 2021-09-28 21:07
我的本来是5,结果一个都没过,就改了改,发现11 1 2的测试用例变成了7,无语了,希望有好心人帮我看看错在哪里。🙃
点赞 回复
分享
发布于 2021-09-28 21:18
好兄弟第三题思路是什么 我想了好久用hashmap结果没时间写了
点赞 回复
分享
发布于 2021-09-28 22:32
荣耀笔试是不同岗题不一样嘛?还是随机抽取。
点赞 回复
分享
发布于 2021-09-30 11:52

相关推荐

1 6 评论
分享
牛客网
牛客企业服务