期末考试

链接

信息提取: 学生有n名,他们要考m个科目,每个人都有希望所有成绩出分的天数

这里给出的学生的不满意度C,只要出分成绩晚了k天,学生就会产生k x C的不满意度

题目还给出两种调整出分方式

1.将X科目的老师调到Y科目,X延迟出分一天,Y提前一天,产生A点老师不满意度

2.增加老师到Z科目,Z科目提前一天,产生B点老师不满意度

我们需要做的,就是找到最佳调整方式,是总不满意度最小

首先,我们不妨思考,最佳调整方式是调整什么

应该是最晚所有科目的出分天数

假设最晚所有出分科目的天数为T,那么T的范围应在学生希望出分天数的值域内

设总不满意度为f(T),应该能想到f(T)是先减后增的,就可以使用三分法解决(当然,如果某些数据特别离谱,就成了一直递减(老师的不满意度非常大)或一直递增(学生的不满意度非常大),照样能用三分法解决)

还有一个问题,我们怎么计算f(T)

如果A>=B的话,我们只只需要采用第二种调整方式进行了

如果A<B的话,我们先尽可能得采用第一种调整方式,在采用第二种调整方式

当然,还要考虑最特殊的情况,也就是C=10^16,此时如果还用函数判断就不行了

推测原因是数字太大,超过了long long的最大范围

这个情况我们只需要将T调整为左边界就行了,因为学生的不满意度是天文数字,太大了

代码实现

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
long long f(int T, vector<int>&b, vector<int>&t,long long A,long long B,long long C) {
	
	long long neg = 0, finals = 0;
	long long teacher_cost = 0;
	if (A < B) {
		for (int i = 0;i < b.size();i++) {
			if (b[i] < T) {
				neg += (b[i] - T);
			}
			else {
				finals += (b[i] - T);
			}
		}
		if (finals + neg > 0) {
			teacher_cost = B * (finals + neg) + (-neg) * A;
		}
		else {
			teacher_cost = A * finals;
		}
	
	}
	else {
		for (int i = 0;i < b.size();i++) {
			teacher_cost += B * (b[i] > T ?  b[i]-T : 0);
		}
	}
	long long student_cost = 0;
	for (int i = 0;i < t.size();i++) {
		student_cost += C * (t[i] < T ? T - t[i] : 0);
	}
	return student_cost + teacher_cost;
}
int main() {
	long long A, B, C;
	cin >> A >> B >> C;
	int m, n;
	cin >> n >> m;
	vector<int>t(n), b(m);
	for (int i = 0;i < n;i++) {
		cin >> t[i];
	}
	for (int i = 0;i < m;i++) {
		cin >> b[i];
	}
	int right = *max_element(t.begin(), t.end()), left = *min_element(t.begin(), t.end());
	if (C > 1e15) {
		cout << f(left, b, t, A, B, C);
		return 0;
	}
	/*cout << f(1, b, t, A, B, C) << endl;*/
	long long min_cost = 0;
	while (left <= right) {
		int mid_l = left - (left - right) / 3, mid_r = right - (right - left) / 3;
		long long l_cost = f(mid_l, b, t, A, B, C), r_cost = f(mid_r, b, t, A, B, C);
		if (l_cost > r_cost) {
			left = mid_l + 1;
			min_cost = r_cost;
			/*cout <<"r_cost" << r_cost << endl;*/
		}
		else {
			right = mid_r - 1;
			min_cost = l_cost;
			/*cout <<"l_cost" << l_cost << endl;
			cout <<"right" << right << endl;*/
		}
	}
	cout << min_cost;
}

注释是我的调试,不用看

时间复杂度:O((n+m)logR) R为数据范围,即right-left

空间复杂度:O(n+m)

全部评论

相关推荐

从年头开始,就一直在忙忙碌碌,背八股,投简历,找实习。我人生的第一场面试是腾讯的实习岗面试,大概是三月份吧,那时候我lc几乎就没怎么刷,八股也是被的稀稀拉拉。一上来面试官还没让做自我介绍就甩了五道编程题给我做,但我一道都不会做,他没有开摄像头,我看着空白的函数段和在屏幕中那个窘迫的我,手心一直在冒汗,过了大概25分钟,他问我遇到了什么问题,我说“不好意思面试官,这里面的题,我哪一道都没有思路”就这样,我说完本次面试唯一的一句话后,结束了这场面试,关闭会议后我坐在电脑屏幕前发呆了很久,其实也没有感到难过,只是大脑一片空白后面也陆陆续续收到其他的一些面试,然后我不知道我哪来的自信,我就偏偏要去大厂,投递的全是叫得上名儿的大厂,结果不是笔试没过就是面试中答不上来,但是后面所有的面试官都很好,会耐心的指出我的不足或者可以改进的地方,让我每次面试后都有所进步。到了四月末,为了不拖我秋招的进度,我在boss上也开始投递一些中厂,然后顺利地拿到了offer,但我清楚的知道,我不属于那里,我不是没有资格去更高的平台,只是我还没有准备好而已。五月份我一个人从佛山出发,坐动车到了深圳这座城市,租到了满意的房子,买了一口小电锅,开始我的实习生活。深圳真的很奇幻,一边是密密麻麻的城中村,回家走在路上感觉能被电鸡创死,一边是高楼耸立的CBD,全是英文牌坊的商场,感觉每一次出地铁口都是在开盲盒。我开始逐渐适应一个人的生活,一个人自己给自己做饭,一个人吃烤肉,无聊的时候一个人去唱k,去逛展,甚至用dy开游戏直播,但有时候也会半夜emo躺床上在某个瞬间觉得自己咋这么惨入职第一天,看到自己工位上挂着“前端开发实习生-XXX”的时候,有一种不真实的感觉,我咋就开始上班了,像小孩儿装大人一样,第一个月收到工资还觉得哇撒好多,后面就在想快快给我涨工资。整个实习大概持续了三个月半吧,这里非常感谢我的mt,他不仅制定了简而有序的培养方案,还在工作与生活上给予了我非常多的支持,最开始的一个月,那个规划表里面真的是按天为单位去罗列我要干什么的,我完成一项就在上面打一个勾然后mt帮我去检验成果,后面他就慢慢放手,提醒我要开始进行思维的转换,要开始学着主动,自己去沟通,有风险只要及时暴露给他,他帮我兜底。这段时间我真的成长非常快,不仅仅是敲代码,像业务流程,技术选型,排查问题,遇到需要跨团队解决问题的能力都有所提升,到后面我好像就是一个“正式员工”了,干的还算不错,+2说如果转正要给我涨工资。mt经常与我one&nbsp;one一些我在工作上暴露的一些问题和他看到我进步的地方,真的是亦师亦友,从入职欢迎的那一顿饭到最后我离职欢送的那一段饭,前前后后我的mt请我吃了得五六顿饭了,平日也是带着我和前端同事一起吃饭,希望我能够在大家面前多刷刷脸,告诉我同事之间的关系也很重要,他忙的时候会给我发消息给我推荐哪里好吃。mt最后一次跟我one&nbsp;one就是我提离职准备秋招了,他希望我能够留下来,问我的意愿是怎么样的。“我还是说想去到一个更好的平台发展”他笑着点点头,和我们最后一顿饭碰杯一样说道“预祝你顺利拿到大厂offer,前程似锦”在公司的最后一天晚上,mt帮我记录了我在公司的最后几个瞬间,拍了好多照片,我带着这段回忆和经历重返了校园不知道大家有没有这种感觉&nbsp;,实习或者工作后回到学校会觉得不真实,好像自己已经离开了很久了不再属于这里了,外面被拷打了一番感觉岁月静好哈哈,回来去测mbti,从i/enfp变成了esfp?所以本就持怀疑态度的我再也信这玩意儿了。短暂歇了一段时间就开始准备秋招了,诚实讲相比于准备实习,秋招的整个阶段都比较浮躁,不知道是八股滚了一遍又一遍的原因还是时间线确实太长了,面试前其实不想做太多的复习。但是心态上就比实习那时候更加的平和,能过就过,不过拉倒,基本上有面试的中大厂一面都可以过,就是在二面上栽跟头。说实话秋招除了能力真的挺看运气的,看合不合面试官眼缘,问的问题是不是刚刚好都会答,但是越努力越幸运嘛,还是得在每次面试后总结面经,然后相应得拓宽自己的知识范围。期间加了几个秋招群,发现应聘大厂的真的是人才扎堆,硕士满天,92横飞,很担心最后横向自己的履历比不过别人。面试期间比较抓马的一幕是,我携程(上海)已经hr面后泡了1个月了,然后我在面哈啰的时候一个021(上海)开头的电话打过来,我以为是oc电话,但是又出于对面试官的尊重没有马上接听,面试结束后赶紧打了过去,结果是之前在boss上面投递的另外一家公司的笔试提醒......好在几天后携程真的打过来了,真是命运捉弄秋招人,没想到是秋招的第一家面的公司最后给到了offer,这时候已经接近12月了,终于是松了口气结束了秋招。最后总结一下吧,感觉写到这里回头看写的就像流水账,其实从选方向到实习到秋招,我非常感谢我坚持了我自己认为对的事情,身边没有一个同学选择前端,但是我觉得用户能直接与我做的界面流畅交互让我觉得有成就感,我也喜欢好看的东西,我乐意与UI打交道,我选择了。对于我拒绝了实习转正,别人也不明白明明待遇还不错为什么还要离开,我选择了。在我实习和秋招在大厂面试吃瘪的时候,有时会收到一些质疑,我选择继续,实习不行秋招,秋招不行春招。希望在未来,我也能坚持自己的想法,大步向前。
牛客80849854...:看完了,真不容易夸夸自己吧太棒了您
2025年终总结
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务