文章目录
-
- 软件工程实习:
- 程序员节发橙子
- 众数出现的次数
软件工程实习:
题目描述:
某大学的《软件工程》必修课分为理论和实践部分。理论部分由该校教授完成授课;而实践部分是由第三方的公司主导,需要同学们在五周时间内自学 HTML、css、JavaScript、vue、Python、django 等技术,并组队完成一个真实的互联 商业应用。
参与这个课程的有 n(0≤n≤1000) 个学生,分成了不超过 26 个队伍,每个队伍用 A 到 Z 来表示。每个队伍都会完成一个项目,并以队伍为单位,给所有队伍(包括自己队伍)打分,范围是 0 到 100 的整数。
为了平息学生对这门课产生的出多问题的不满(比如工作量太大、时间过于紧张、考核方式不公平等),老师决定使用一种“看起来”很公平的方式来决定每组队伍的项目得分:
对于某个队伍,首先计算所有队伍(包括自己)给这个队伍评分的平均值,然后剔除掉和这个平均值差别超过 15 分的评分(保证不会出现所有的评分全部被剔除的情况),最后再对剩余的评分求平均值,四舍五入取整后作为这个队伍的项目得分。
对于每一个同学,我们已经得知他们的队伍代 和理论成绩(也是 0 到 100 分的整数)。这位同学的最后得分就是 60% 的理论成绩加上 40% 的所在队伍的项目得分,然后四舍五入取整。
现在老师想知道所有同学的分数排行。请按最后得分从高到低的顺序,输出每位同学的得分和他所在的队伍。
输入格式:
程序员节发橙子
题目描述:
错误思想:
这个题我的想法居然是找出最小成绩的那个同学,然后以他为标准,分别向两边去扩散,殊不知这个是完全错误的。
当然对于样例是没一点毛病
样例:
5
3 4 5 4 3
输出 9 // 1 2 3 2 1 没一点毛病
当时如果是 6 1 9 7 6
这种思想的话给的橘子数为 : 2 1 2 1 0
居然出现0了!
正确的思想是:
(1)我们先假设每个人先发一个橘子,因为每个人至少要收到一个橘子
(2)从左到右扫描一遍,然后如果右边的成绩比左边的大,不用说这个人分的橘子数肯定是左边那个人+1,我们不要在这个时候判断右边比左边小的,因为这个可能会导致出现负数。
(3)最后从右向左扫描一遍,如果左边比右边大的话,a[i-1] = max(a[i-1],a[i]+1)相等的话:
a[i-1] = max(a[i-1],a[i]) 相信也挺好理解的
代码:
package 传智杯第二届;import java.io.*;public class Test2 { static int n; static int a[] = new int[1000010]; static int num[] = new int[1000010]; public static void main(String[] args) throws IOException{ StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out)); re.nextToken(); n = (int)re.nval; long ans = 0; for(int i = 1; i n;i++){ re.nextToken(); a[i] = (int)re.nval; } for(int i = 1;i n;i++){ if(a[i] a[i+1]) num[i+1] = num[i]+1; else if(a[i] == a[i+1]) num[i+1] = num[i]; } for(int i = n;i > 1;i--){ if(a声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!