兼职
Posted smile_to_warm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了兼职相关的知识,希望对你有一定的参考价值。
兼职
时限:最多 50 个用例,1 秒 (C/C++),1.5 秒 (Java)
S公司有N名全职员工。公司已经定制好了整个业务的工作日程,每位员工都被安排了工作,并且每个员工处理业务时,一次只能做一项工作。所以当业务日程重复了N次以上时,S公司就需要聘请兼职来工作。任何人都可以在中途接手另一个人的工作,这时的工作交接所耗费的时间和成本忽略不计。当聘请兼职时,如果同时跟多个人签订合约,那么提供兼职的公司会给予一定的费用折扣。
当给出了S公司的全职员工数量、整个业务日程,以及每日需要给兼职支付的费用信息时,想把兼职的雇用费用弄成最低。
当给出如上所示的费用折扣信息时,如果S公司要聘请4个兼职,那么最优的方式是采用2 + 2,这时费用只需 38,000 韩元。如果业务日程信息如上所示,可以采用下面的方式开展工作。
如上所示,第1天需要1个人、第2天需要3个人、第3-4天需要4个人、第5天需要3人、第6天需要2个人、第7-8天需要1个人、第10-15天需要1个人。假设有2名全职员工,那么可以在第1、6-8、10-15天,只由全职员工处理业务,在第2天聘请1个兼职,费用为10,000韩元,在第3-4 天每天聘请2个兼职,费用为38,000韩元,在第5天聘请1个兼职,费用为10,000韩元。这样支付的就是最低兼职费用58,000韩元。
当给出S公司的全职员工数量、整个业务日程,以及每日给兼职支付的费用时,请找出给兼职支付的最少费用。
[限制条件]
1. 全职员工数量N为介于0到100,000之间的整数。
2. 业务日程数量M为介于1到200,000之间的整数。
3. 业务日程会给出开始日期和结束日期。如果日程之间的结束日期和开始日期之间有重合,则表示需要两个人。
4. 业务日程的开始日期S和结束日期E是介于1到100,000之间的整数.
5. 给兼职支付的费用C是介于10,000到100,000,000之间的整数。
6. 一个日程的业务能以一天为单位由多个人分工完成。
7. 任务安排完后,不应有多余的兼职。
8. 雇佣信息中一定会提供聘请一名兼职的费用。
[输入]
首先给出测试用例数量 T,接着给出 T 种测试用例。
每个测试用例的第一行空格区分给出全职员工数量N、业务日程数量M、给兼职支付费用的信息数量K。()
接下来通过M行,每行空格区分给出该业务日程的开始日期S和结束日期E。() 接下来通过K行给出聘请兼职时每天需要支付的费用信息,该信息空格区分给出人数P,需支付的费用C。()
[输出]
一个测试用例输出一行。对每个测试用例都输出“#x”(x为测试用例的编号,从1开始),然后输出S公司需要支付的最低兼职费用。
[输入和输出示例]
(输入)
3
2 5 5
1 5
2 8
3 6
10 15
2 4
1 10000
2 19000
5 47000
10 90000
150 1300000
1 10 5
1 10
9 10
3 9
6 10
10 10
6 9
3 7
1 6
7 7
1 10
1 10196
3 23895
4 29620
10 53460
15 57180
1 10 6
1 5
5 9
3 7
1 5
4 8
2 6
1 3
2 4
4 7
6 7
1 13354
2 23714
5 58520
10 111670
11 121319
17 185147
(输出)
#1 58000
#2 324280
#3 391248
解题思路:
如果先不考虑业务日程,求最小费用,每组折扣,可以选择多个,是个完全背包问题;
其中,费用种类总和K为物品数量,费用信息的每组人数为权重w[i],每组费用为物品价值v[i],业务日程数量M为背包容量;
求每天的工作需要的员工人数有两种方法:
1.差分数组
2.Indexed Tree, 用Indexed Tree时,query方法和update方法与平时的相反
package tree; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; /** * 如果先不考虑业务日程,求最小费用,每组折扣,可以选择多个,是个完全背包问题; * 其中,费用种类总和K为物品数量,费用信息的每组人数为权重w[i],每组费用为物品价值v[i],业务日程数量M为背包容量; * * 求每天的工作需要的员工人数有两种方法: * 1.差分数组 * 2.Indexed Tree, 用Indexed Tree时,query方法和update方法与平时的相反 * @author XA-GDD * */ public class Freelancer_0322 { static int T,N,M,K; static int _max_Nval = 100000; static int _max_Mval = 200000; static int _max_Kval = 100; static int [][] work = new int[_max_Mval+1][2]; static int [][] fee = new int[_max_Mval+1][2]; static long [] dp = new long[_max_Mval+1]; static int [] empCnt = new int[_max_Nval+2]; static int [] idxTree = new int[_max_Nval*4]; static int offset; static long ANS; public static void main(String[] args) throws IOException { System.setIn(new FileInputStream("D:\\\\workspace\\\\sw_pro\\\\test_case\\\\sample_input_0322.txt")); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); for(int testCase = 1; testCase<=T;testCase++) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); K = Integer.parseInt(st.nextToken()); Arrays.fill(empCnt, 0); Arrays.fill(dp, 1,M,Long.MAX_VALUE); Arrays.fill(idxTree, 0); for(int i=0;i<K;i++) { Arrays.fill(fee[i], 0); } ANS=0L; //业务日程 int maxDate = 0; for(int i=0;i<M;i++) { st = new StringTokenizer(br.readLine()); int startDate = Integer.parseInt(st.nextToken()); int endDate = Integer.parseInt(st.nextToken()); maxDate = Math.max(maxDate, endDate); //方法1:差分数组 ======start========= // empCnt[startDate]++; // empCnt[endDate+1]--; //方法1:差分数组 ======end========= //方法2:Indexed Tree ======start========= work[i][0] = startDate; work[i][1] = endDate; //方法2:Indexed Tree ======end========= } //方法1:差分数组 ======start========= // for(int i=1;i<=maxDate;i++) { // empCnt[i] += empCnt[i-1]; // } //方法1:差分数组 ======end========= //费用 for(int i=0;i<K;i++) { st = new StringTokenizer(br.readLine()); fee[i][0] = Integer.parseInt(st.nextToken()); fee[i][1] = Integer.parseInt(st.nextToken()); } //完全背包 for(int i=0;i<K;i++) { for(int j=fee[i][0];j<=M;j++) { dp[j] = Math.min(dp[j], dp[j-fee[i][0]]+fee[i][1]); } } //方法1:差分数组 ======start========= // for(int i=0;i<=maxDate;i++) { // ANS += empCnt[i]>N? dp[empCnt[i]-N]:0; // } //方法1:差分数组 ======end========= //方法2:Indexed Tree ======start========= int k=0; while((1<<k)<maxDate) { k++; } offset=1<<k; for(int i=0;i<M;i++) { update(offset+work[i][0],offset+work[i][1]); } for(int i=1;i<=maxDate;i++) { int currEmpCnt = query(offset+i); ANS += currEmpCnt>N? dp[currEmpCnt-N]:0; } //方法2:Indexed Tree ======end========= System.out.printf("#%d %d\\n",testCase,ANS); } } static void update(int start ,int end) { while(start<=end) { if(start%2==1) { idxTree[start]++; } if(end%2==0) { idxTree[end]++; } start=(start+1)>>1; end = (end-1)>>1; } } static int query(int index) { int res=0; while(index>0) { res += idxTree[index]; index = index>>1; } return res; } }
大学生兼职:适合在校大学生的兼职
大学生兼职:马上就要开学了,这个漫长的假期,有很多的大学生做兼职赚了不少钱,但是开学后,要把状态放到学习上了,可以在业余时间做一下兼职赚点生活费,那么作为大学生的你,其实可以尝试很多兼职,给自己一些胆量。利用课余时间,周末时间来挣点零花钱花吧,可以值得一试。但是切勿长久干了,除了增加社会经验赚点辛苦钱外,真的不值得你长期做,要知道那样的兼职工作你不上大学也是可以做的。
生活不易,唯有努力,多做一些兼职工作,体验一下生活多么的不容易。其实可以做一下大学生兼职家教,做家教其实是很容易的,也不会特别的辛苦。如果要做的话一定要好好规划好时间,教个小学生和初中生,真的很容易,尤其是英语,数学什么的,很容易,而且现在的孩子也都非常聪明,基本上都是一教就会,所以觉得挣这份钱还是比较容易的。
如果是做一些和自己专业相关的话,那我还是很愿意的。其实做我自己专业的我还是挺喜欢的,没事给人家设计一个封面啦,写一个简单的文案啦,还是很好的,我学的是平面,所以接触的广一些,也比较容易一些,现在很多的威客平台,比如猪八戒,特别适合那些有技术要求的专业性大学生赚钱。
其实社会实践在大学很重要的,而恰恰兼职是更好锻炼你的方式。如果你想在专业上有什么收获,经济条件什么也还可以的话,那我建议你可以专心去学习,报个四六级,教师资格证,考个研什么的,还是很好的,但你要有足够的耐心,也要可以学进去,不要白白浪费了好的学习时光。
那么有没有更适合在校大学的兼职呢?在这个给各位大学习推荐一个不用投资,兼职专职都可以的项目,适合任何人来做,这个项目就是高佣联盟。
如果你毕业以后马上就想上班的话,那我建议你可以多去参加一些兼职去锻炼一下,出去接触一下社会锻炼一下自己,是可以提升自己的自身素质的,其实做过一些兼职的同学都会很清楚,挣钱是很辛苦的,而且找到一个好的兼职也是很不容易的,但是比钱更重要的是,它让你懂得了生活的酸甜苦辣,人情冷暖,让你懂得了父母挣得每一分钱是多么的不容易。
在兼职的过程中,会遇到很多让你讨厌的人和找你麻烦的人,也会遇到各种各样你接受不了的人,但是现实社会就是这样,你要学会适应、学会忍耐。再有,出去兼职的话千万要小心,一定要找一些正规的兼职,比如说什么交钱的,都是骗人的,正常的兼职是不会让你去交钱的,所以一定小心一些,尤其是小女孩,一定要看清了在去做,有伤自己的千万不要,毕竟我们第一是安全。
推荐阅读:
以上是关于兼职的主要内容,如果未能解决你的问题,请参考以下文章
基于SSM+JSP实现的兼职论坛网站(用户/管理员登录论坛交流兼职发布用户管理帖子管理兼职管理广告管理信箱管理用户收藏系统公告)