当前位置: 首页 > news >正文

乐山网站建设唐山百度提升优化

乐山网站建设,唐山百度提升优化,郑州正云网站建设,软件测试40岁以后出路MVP 争夺战 MVP 争夺战 知识点DFS搜索 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在星球争霸篮球赛对抗赛中,3 强大的宇宙战队,希望每个人都能拿到MVP。 MVP的条件是,单场最高分得分获得者, 所以宇宙战队决定在比赛中, 尽可能让更多的队员上场,且让所有有得分的队员…

MVP 争夺战

MVP 争夺战
知识点DFS搜索
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
在星球争霸篮球赛对抗赛中,3 强大的宇宙战队,希望每个人都能拿到MVP。 MVP的条件是,单场最高分得分获得者, 所以宇宙战队决定在比赛中, 尽可能让更多的队员上场,且让所有有得分的队员得分都相同。 然而比赛过程中的每一分钟的得分都只能由某 个人包揽。
输入描述:
输入第一行为一个数字t,表示有得分的分钟数(1<=t<=50) 第二行为t个数字,代表每 分钟的得分p (1 <= p <= 50)
输出描述:
输出有得分的队员都是MVP时最少的MVP得分。
示例1
输入:
9
5 2 1 5 2 1 5 2 1
输出:
6
说明:
样例解释:一共4人得分,分别都为6分
5+1
5+1
5+1
2+2+2
解题思路:
此题应该是正确率最低的题目了,只有0.71%;
首先对得分数组进行排序,确定平均得分的最小值和最大值。
最小值:得分数组的最大值(因为每一分钟的得分都只能由某一个人包揽)
最大值:得分总数/2(最低两个人平分)
从最小值遍历到最大值,需要注意的是,只有总得分整除平均分时才有必要去判断。判断的
时候需要从最大值开始遍历(也就是得分数组尾部)
如示例1:
9
5 2 1 5 2 1 5 2 1
对数组进行排序1 1 1 2 2 2 5 5 5 总分24
最小平均分:5,最大平均分:24/2=12
当n=5:(从数组尾部开始)
i=8,ints[8]=5,5-5=0,则满足平均分,使用过的得分置零ints[8]=0
i=7,ints[7]=5,5-5=0,则满足平均分,使用过的得分置零ints[7]=0
i=6,ints[6]=5,5-5=0,则满足平均分,使用过的得分置零ints[6]=0
i=5,ints[5]=2,5-2=3;
i=4,ints[4]=2,3-2=1;

i=2,ints[2]=1,1-1=0,满足平均分,使用过的得分置零ints[5]= ints[4]= ints[2]=0;
i=4,ints[4]=0,跳过。
i=3,ints[3]=2,5-2=3;
i=2,ints[2]=0,跳过;
i=1,ints[1]=1,3-1=2;i=0,ints[0]=1,2-1=1,不满足平均分。
最终数组剩下的总分4!=0,说明不能对平均分=5 进行平分。
当n=6:(从数组尾部开始)
i=8,ints[8]=5,n=6-5=1;
i=7,ints[7]=5,1-5=-4<0,还原到n=1;
i=6,ints[6]=5,1-5=-4<0,还原到n=1;
i=5,ints[5]=2,1-2=-1<0,还原到n=1;

i=2,ints[2]=1,1-1=0,,满足平均分,使用过的得分置零ints[8]= ints[2]=0;
i=7,ints[7]=5,n=6-5=1;
i=6,ints[6]=5,1-5=-4<0,还原到n=1;
i=5,ints[5]=2,1-2=-1<0,还原到n=1;

i=2,ints[2]=0,跳过;
i=1,ints[1]=1,1-1=0,满足平均分,使用过的得分置零ints[7]= ints[1]=0;
i=6,ints[6]=5,n=6-5=1;
i=5,ints[5]=2,1-2=-1<0,还原到n=1;
i=4,ints[4]=2,1-2=-1<0,还原到n=1;

i=2,ints[2]=0,跳过;
i=1,ints[1]=0,跳过;
i=0,ints[0]=1,1-1=0,满足平均分,使用过的得分置零ints[6]= ints[0]=0;
i=5,ints[5]=2,n=6-2=4;
i=4,ints[4]=2,4-2=2;
i=3,ints[3]=2,2-2=0,满足平均分,使用过的得分置零ints[5]= ints[4]= ints[3]=0;
最终数组剩下的总分0==0,说明能对平均分=6 进行平分。
以此类推。。。
最终最少的MVP 得分为6

public class Main{
public static int score = 0; //MVP 得分
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
sc.nextLine();
String[] p = sc.nextLine().split(" ");
int[] ints = new int[t];
for(int i=0; i<t; i++){
ints[i] = Integer.valueOf(p[i]);
}
int count = Arrays.stream(ints).sum();
Arrays.sort(ints); //对数组进行排序,
int min = ints[t-1]; //求出数组中最大值,为MVP 最低得分
int res = 0;
for(int i=min; i<count/2; i++){ //以2 个人平分的分数为边界
if(count%i == 0){ //得分总数可以整除得分
score = i; //当前平均分
if(combine(ints, score, new ArrayList<>(), t-1)){ //从最后一位开始计算
(否则会出现问题)
res = score;
break;
}
}
}
System.out.println(res == 0 ? count : res); //分数平分不成功则输出总分
}
/**
*
* @param ints 篮球得分数组
* @param n 分数
* @param list 使用过的得分
* @param index 得分数组的索引
* @return
*/
public static boolean combine(int[] ints, int n, List<Integer> list, int index){
if(n <= 0){ //分配的得分小于等于平均分
if(n == 0){
for(int i=0; i<list.size(); i++){ //将分配过的得分清0(此处不能用删除,
否则会越界)
ints[list.get(i)] = 0;
}
return true;
}
}
for(int i=index; i>=0; i--){
if(n<0 || Arrays.stream(ints).sum()==0){ //得分小于0 或者总得分等于0
时跳出循环
break;
}
int x = ints[i];
if(x == 0){ //此得分失效时寻找下一个得分
continue;
}
list.add(i); //分配过的得分集合
if(combine(ints, n-x, list, i-1)){ //分数获取成功后继续下一个分数分配
int count = Arrays.stream(ints).sum(); //当前得分数组中所剩的总得分
if(count == 0 || count%score != 0){ //剩余总分等于0 或不能对得分进
行整除则跳出循环
break;
}
combine(ints, score, new ArrayList<>(), ints.length-1);
}
list.remove(list.size()-1);
}
return Arrays.stream(ints).sum() == 0; //如果剩余总分等于0 则表示分配成功
}
}

python解法:

import time
start = time.time()nums = [5,5,5,2,2,2,1,1,1]
# nums = [2,5,1,2,2,5,1,5,1]
# nums = [3,2,4,3,6]
def get_factors(num):factors = []for i in range(1, num+1):if num % i == 0:factors.append(i)return factors
sums = sum(nums)
factors = get_factors(sums)
Global_Target = []# 先加出来1个因子
# 然后把因子设为target,让后面的计算去拟合target,超于target的直接退出
def find_next_sum(cur_sum,cur_nums,target = None,match_num = 0):global Global_Targetif len(cur_nums) == 0:if target is None:return 0,0if (target * (match_num + 1) != sums):return 0,0if target not in Global_Target:print (f"hit {target}")Global_Target.append(target)return target,match_num#必须要把数全部用完才有max_match_nummax_match_num = 0max_target = targetfor i in range(len(cur_nums)):new_tar = cur_sum + cur_nums[i]#多个子数组if target is not None and target == new_tar:cur_target , cur_max_match_num = find_next_sum(0,cur_nums[:i] + cur_nums[i+1:],target = new_tar,match_num = match_num + 1)if cur_max_match_num > max_match_num:max_match_num = cur_max_match_nummax_target = cur_targetbreak#找到新的targetif target is None and new_tar in factors:cur_target , cur_max_match_num = find_next_sum(0,cur_nums[:i] + cur_nums[i+1:],target = new_tar)if cur_max_match_num > max_match_num:max_match_num = cur_max_match_nummax_target = cur_target#target越界if new_tar > sums / 2:continue#累加过程cur_target , cur_max_match_num = find_next_sum(new_tar,cur_nums[:i] + cur_nums[i+1:],target = target,match_num = match_num)if cur_max_match_num > max_match_num:max_match_num = cur_max_match_nummax_target = cur_targetreturn max_target,max_match_numcur_target , cur_max_match_num = find_next_sum(0,nums)
cur_max_match_num += 1
print (f"{cur_target},{cur_max_match_num}")        end = time.time()
print (f"time cost:{end - start}")
http://www.lbrq.cn/news/2713519.html

相关文章:

  • SharePoint做网站好吗杭州seo排名公司
  • 中国室内设计装饰协会公司网站如何seo
  • 江苏省建设委员会网站南京seo网络推广
  • 广州的网站建设公司百度公司总部
  • 手机网站建设价格是多少线下推广有哪几种渠道
  • wordpress中文字设置白杨seo教程
  • 杭州市做网站中国国家培训网
  • 怎样做网站快照青岛百度推广优化
  • wordpress注册取消邮箱验证码西安seo技术培训班
  • 乌克兰网站服务器神起网络游戏推广平台
  • 网站建设管理工作小结搜索引擎营销的优势
  • 网站后台密码忘了搜百度盘
  • 手机网站如何做营销电商培训机构哪家好
  • 网站建设的合同模板市场营销推广
  • 网站动画是怎么做的2345网址导航手机版
  • 任何判断网站SEO做的好坏seo自学
  • 如何帮公司做网站上海职业技能培训机构一览表
  • 肇庆有哪家做企业网站的公众号软文是什么意思
  • windows2012做网站如何自己做网络推广
  • 学校网页网站模板免费下载品牌营销推广策划公司
  • 网站关键词怎么做太原seo关键词优化
  • 郑州专业做网站的公司搜索引擎关键词怎么选
  • 域名怎么绑定自己网站公关
  • 网站建设规划书参考模板百度快速排名用是
  • 做网站的职业视频网站建设
  • 八步网站建设广东互联网网络营销推广
  • 优秀网站介绍seo综合查询 站长工具
  • 怎样搭建一个企业网站大连网站建设
  • 如何用网站首页做404北京网站建设公司报价
  • 自己网站如何做关键词sem优化师
  • week1-[分支嵌套]公因数
  • 在mysql> 下怎么运行 .sql脚本
  • ASQA: 面向模糊性事实问题的长格式问答数据集与评估框架
  • Redis7学习——Redis的十大类型String、List、Hash、Set、Zset
  • Java毕业设计选题推荐 |基于SpringBoot的水产养殖管理系统 智能水产养殖监测系统 水产养殖小程序
  • IDEA创建一个VUE项目