【比赛回顾】广工大2020级年ACM第一次月赛——Dio的面包工坊
题目:
Description
Dio是荒木庄的面包师傅,和手部美容师Bo良Ki影是好朋友。Bo良Ki影会在每个月的某一天来买注入爱心的小面包。面包的爱心总值是爱心小面包的乘积。这个月Dio会把n个爱心值分配到许多个爱心小面包中,为了给好朋友Bo良Ki影最大的爱心总值,他要如何分配呢?
注意:爱心总值可能很大,请使用long long存储答案
Input
第一行输入一个整数T,表示有T组数据。(1<=T<=1000)
每组数据输入一个整数n,表示Dio的爱心值。(1<=n<=100)
Output
每组数据输出一个整数,表示最大的爱心总值
Sample Input
2
3
5
Sample Output
3
6
问题分析:
第一次看其实是有点蒙,不知道如何下手,这时也只能先列表咯,看看前几个数据有没有什么规律。
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 6 | 9 | 12 | 18 | 27 | 36 |
这个难度应该不大,因为每个数字的组合有限。
其实我们在列表的时候就发现了,后面的数首先要进行拆分,如9可拆为4+5或3+5,然后每一部分我们都要找出乘积最大的情况,那这时我们就要在列表中去前面找已经算过的最优解若是4+5,对应回去则是4x6,3+5对应回去3x6,故要应用递归函数。
故其实这道题是用局部最优解来找整体最优解,也就是贪心算法,关于这个算法,可见这篇博客。
上述贪心算法用词不太准确,师兄指正后应改为优化后的暴力或者dp(动态规划)
这时我第一次提交的代码如下:
#include <stdio.h>
#include <math.h>//用函数来解题
long long int sum ( int n );int main()
{int t, n;long long int ans;scanf ( "%d", &t );while ( t-- ){scanf ( "%d", &n );ans = sum(n);printf ( "%lld\n", ans );}return 0;}//函数本体
long long int sum ( int n )
{long long int total;int mid;int i, j;//n小于3时无需拆分 if ( n<=3 ){total = n;}else{ mid = n/2;//错误的代码 误以为中间分一半就一定是最大 if ( n%2==0 ){total = sum(mid)*sum(mid);}elsetotal = sum(mid)*sum(mid+1);}return total;}
很显然,上面的代码并没有通过,原因是误以为中间分一半就一定是最大。其实上面的9就可以证明,分成3+3+3时才是最大。
简单修改后如下
total = sum(1)*sum(n-1);//把n的所有拆分情况列出并递归求解 for ( i=1; i<=mid; i++ ){if ( total < sum(i)*sum(n-i) )total = sum(i)*sum(n-i);}
虽然修改后符合条件,但很遗憾的是大大超时了,拆分情况有很多种,每一种又有很多次递归操作,故时间复杂度很大。
那证明其实我的算法还是有问题,要如何调整呢?
AC代码:
#include <stdio.h>
#include <math.h>//全局变量自动初始化为0
long long int a[101];
long long int sum ( int n );int main()
{int t, n;long long int ans;scanf ( "%d", &t );while ( t-- ){scanf ( "%d", &n );ans = sum(n);printf ( "%lld\n", ans );}return 0;}//函数本体
long long int sum ( int n )
{long long int total;int i, j;//n小于3时无需拆分 a[1] = 1;a[2] = 2;a[3] = 3;if ( n<=3 )return a[n];else{//将数组先一步步以123数组递归算好,然后直接输出就好。//其实还有优化的空间//把这个放在main函数里面就好,这样子不用每次都算数组,算一次就好。//后面的几次会浪费一点点时间,但好在没超时for (int i=4; i<=100; i++){//只用i/2即可,因为另一半就是i-jfor (int j=1; j<=i/2; j++){if (a[i] <= a[j] * a[i-j])a[i] = a[j] * a[i-j];}}total = a[n];}return total;}
【比赛回顾】广工大2020级年ACM第一次月赛——Dio的面包工坊相关推荐
- 【题目回顾】广工大2020年10月ACM第一次月赛B题--Dio的面包工坊
题目描述 Description Dio是荒木庄的面包师傅,和手部美容师Bo良Ki影是好朋友.Bo良Ki影会在每个月的某一天来买注入爱心的小面包.面包的爱心总值是爱心小面包的乘积.这个月Dio会把n个 ...
- 广工大第12届ACM校赛A
水题,简单的解方程问题,所有的尾巴都正常,总只数即c/4 , 设正常的有X只,没耳朵的有y只,没尾巴的即(c/4-x-y)只. code #include<stdio.h> int mai ...
- 【比赛回顾】2020广工文远知行杯新生程序设计竞赛(初赛)
[比赛回顾]2020广工文远知行杯新生程序设计竞赛(初赛) 写在前面: 已经更新完除E和F以外的题解(因为这两道我没有时间做了,以后抽空做完后补充).可能我的题解并不是最优的,欢迎交流和讨论~ 文章目 ...
- 个人对北理工2020级硕士研究生张××一篇学术论文涉嫌抄袭的看法
日前,某网站上发布了关于北京理工大学2020级硕士研究生张××以署名第二作者的身份(共同一作)向arxiv上传了一篇学术论文涉嫌抄袭的消息. 处理结果 9月30日,北京理工大学研究生院网站发布< ...
- 重庆大学计算机学院 李琪,【计算机】相聚计科,执梦起航---重庆大学计算机学院2020级研究生迎新会圆满结束...
金秋九月,又是一年迎新时.为帮助全院新生更快的适应研究生生活,明确前进的方向,2020年9月4日下午2:30,计算机学院在A区主教学楼330隆重举行2020级研究生迎新大会. 出席本次迎新会的有计算机 ...
- 重庆大学计算机学院与马云,相聚计科,执梦起航——重庆大学计算机学院2020级研究生迎新会圆满结束...
金秋九月,又是一年迎新时.为帮助全院新生更快的适应研究生生活,明确前进的方向,2020年9月4日下午,计算机学院在A区主教学楼330举行了2020级研究生迎新大会. 出席本次迎新会的有计算机学院院长廖 ...
- 川大计算机学院新生开学典礼,网络空间安全学院2020级本科新生开学典礼顺利召开...
2020年9月21日下午两点整,四川大学网络空间安全学院本科新生开学典礼正式召开.网络空间安全学院常务副院长陈兴蜀教授.直属党支部书记兼副院长秦燕教授.副院长刘嘉勇教授.副院长杨频教授.学生科科长黎红 ...
- 吉林大学计算机类分流,吉林大学电子科学与工程学院 2020级专业类学生专业分流工作细则-电子科学与工程学院...
为了进一步深化本科教育教学改革,创新人才培养模式,构建满足学生多元化成长需要的培养体系,我院2020级本科生以"电子信息类"进行大类招生,并在第一学年进行大类培养.大类培养结束后需 ...
- 【调剂】广州大学“方滨兴院士班”(硕士班)欢迎2020级全国网络安全爱好者调剂...
点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复"调剂"是计算机/软件等专业的所有调剂信息集合,会一直更新的. 广州大学"方滨兴院士班"(硕士班) ...
- 广东海洋大学数学与计算机学院校友会,数学与计算机学院召开2020级研究生入学教育会...
为了让2020级研究生尽快适应新的学习和生活环境,10月12日上午,数学与计算机学院在第二教学楼A405会议室召开2020级研究生入学教育会.会议由院长彭小红主持.研究生导师谢仕义.肖来胜.陈入云.叶 ...
最新文章
- kmeans聚类源代码
- 深入理解 Kotlin Coroutine (一)
- 【PAT乙级】1077 互评成绩计算 (20 分)
- answer my questions from the book构建之法.
- 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)
- UVA 12108 Extraordinarily Tired Students
- java学习(七)java中抽象类及 接口
- 【转载】c++之类的基本操作(c++ primer 的读书笔记 ,类对象, 类用户, 类成员的含义)
- Postfix+Mysql+Apache+Dovecot+Thunderbird+Extmail+E
- android悬浮窗工具,Android悬浮窗实例
- 一个喜爱电影的人能利用什么工具?
- matlab求解普通函数的导数问题(diff函数的用法)
- c#中计算三角形面积公式,C#源代码—三角形面积、圆的面积
- 月结重头戏--外币评估
- HTML笔记及案例(全)
- 基于不同策略的英文单词的词频统计和检索系统(C++)
- python-常用算法
- 苹果收取30%过路费_你是顶是踩?
- v-if判断字符串是否相等
- CGB2106-Day10