2020年百度之星程序设计大赛-初赛二前两题(Poker、Distance)解答代码思路
Poker

Problem Description
小沃沃在玩一个有趣的游戏。
初始他有 n 块钱,每一轮他需要投入至少 m 块钱,系统会拿走其中 p% 的钱,并把剩下的钱还给他。
请问在最优情况下,小沃沃最多可以玩多少轮?
假设当前一轮小沃沃投入了 x 块钱,那么他可以收回 ⌊x×(1−p%)⌋ 块钱,其中⌊a⌋ 表示 a 取下整。 小沃沃每一轮投入的钱不能超过他现在拥有的钱。
每一轮投入的钱必须为整数。

Input
第一行一个正整数 test(1≤test≤100000) 表示数据组数。
对于每组数据,一行三个整数 n,m,p(1≤n≤100000,1≤m≤1000,1≤p≤100)。
Output
对每组数据输出一行一个整数表示答案。

Sample Input
2
10 2 50
10 2 100
Sample Output
9
5

这道题比较简单,第一次提交遇到超时问题,后来使用了scanf和printf解决问题。

Accept代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{int test,n,m,sum;float p;cin>>test;while(test--){scanf("%d%d%f",&n,&m,&p);//cin和cout会超时 int r=n,nums=0;while(r>=m){ nums++;r=r-m*p*0.01;}printf("%d\n",nums); }return 0;
}

目前官方提示: 观察到小沃沃每次只会投入 m 块钱,当他手上的钱大于等于 m 时,他可以继续玩,每次会被拿走⌈m∗p%⌉ 这么多钱。那么就很好算了。

Distance

Problem Description
小沃沃所在的世界是一个二维平面。他有 nn 个朋友,第 ii 个朋友距离他的距离为 a[i],小沃沃并不知道这些朋友具体在什么点上。
请问在最优情况下,小沃沃的朋友两两之间的欧几里得距离的和的最小值是几?
假设小沃沃的位置为 P_0 = (x_0,y_0),第 i 个朋友的位置为 P_i = (x_i,y_i),对于所有的 i,需要满足 dist(P_0, P_i) = a[i],并且∑ i=1 n−1∑ j=i+1 n dist(Pi,Pj) 最小,其中 dist(X,Y)dist(X,Y) 为连接点 XX 和点 YY 的线段的长度。x_i,y_i都可以是任意实数。

Input
第一行一个正整数 test(1≤test≤10) 表示数据组数。
对于每组数据,第一行一个正整数 n(1≤n≤100000)。
接下来一行 n 个整数,第 i 个整数 a[i] (1≤a[i]≤1000000000) 表示第 i 个朋友和小沃沃的距离。
Output
对每组数据输出一行一个数,表示∑ i=1 n−1∑ j=i+1 ndist(Pi,P j) 的最小值。答案需要四舍五入到整数。

Sample Input
2
2
3 5
5
1 2 3 4 5
Sample Output
2
20

这道题目也好理解,写程序思路直接,只是又遇到了超时问题。

#include<bits/stdc++.h>
#include<cstdlib>
using namespace std;
//int a[1000000005];//数组太大,会出错
int *a = new int[1000000005];//全局变量动态分配
int main()
{int test,n,i,j;scanf("%d",&test);while(test--){  scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);int sum=0;sort(a+1,a+n+1);//排序i=1;while(i<=n-1)
//      for(i=1;i<=n-1;i++)//时间复杂度O(n^2),超时{j=i+1;for(j=i+1;j<=n;j++){sum=sum+a[j]-a[i];}i++;}printf("%d\n",sum);}delete a;return 0;
}

这道题目出现超时问题,可能数组很大或者算法不够好,两个for循环时间复杂度较高O(n^2),虽然本地测试的时间限时小于1000ms,但是提交还是超时了,后续需要看看其他大佬怎么做的……

目前官方提示最优情况下,所有人必然在由小沃沃出发的在一条射线上(任意两个人的距离都最小)。我们把 a 排序以后,算距离和就比较简单了。

测试时间:


我来更新啦,这个解法就Accept了,转化思路,可以通过数学推导就计算最小的距离,最终时间复杂度为O(n)。
Accept代码:

#include<bits/stdc++.h>
typedef long long LL;
using namespace std;int main()
{int test,n,i,j;ios::sync_with_stdio(false);//避免超时cin.tie(0);cout.tie(0);cin>>test;while(test--){cin>>n;vector<LL> a(n);for(i=0;i<n;i++)cin>>a[i];LL sum=0;sort(a.begin(),a.end());for(i=0;i<n-1;i++){//可通过数学推导得出,实现O(n)的时间复杂度 sum += (a[i+1] - a[i]) * (LL)(i + 1) * (LL)(n - i - 1);}cout<<sum<<'\n';}return 0;
}

sum += (a[i+1] - a[i]) * (i + 1) * (n - i - 1)
关键的这一步数学推导可能有许多朋友存在疑问,为什么能用此取而代之2个for循环呢?
我的推导思路是这样的:
根据题目我们假设更普遍的数据为a[4]={3,5,8,11},我们容易发现在2次循环做法时候,是存在许多重复计算的。
比如:计算3与8的距离,我们用到了3与5、5与8的距离,即是a[2]-a[0]=8-3=2+3, a[1]-a[0]=5-3=2。以此类推。

dist(3,8) dist(3,5) dist(5,8)
a[2]-a[0]=8-3=2+3 a[1]-a[0]=5-3=2 a[2]-a[1]=8-5=3

我们似乎发现了规律,这种做法类似于动态规划,避免了重叠子问题的计算导致效率降低,所以针对这道题可以采用只计算每一个子问题一次,再记录每个子问题被计算的次数,进而提高效率,降低时间复杂度。

(a[i+1] - a[i]) * (i + 1) * (n - i - 1)
分析:
1、a[i+1] - a[i] 就是相邻2个元素的距离,这个好理解。
2、i+1 就是 a[i+1] 元素之前需要用到a[i+1] - a[i]距离计算的次数。
3、n -i -1 就是 a[i] 元素之后需要用到a[i+1] - a[i]距离计算的次数。
举例
a[4]={3,5,8,11}
根据推导式子为:
第一轮:2 * 1 * 3 = 6
第二轮:3 * 2 * 2 = 12
第三轮:3 * 3 * 1 = 9
计算结果27,与我们自行计算一致。实现O(N)时间复杂度。

我的博客园:https://www.cnblogs.com/chenzhenhong/p/13377665.html
我的CSND博客:https://blog.csdn.net/Charzous/article/details/107581452

2020年百度之星程序设计大赛-初赛二(Poker、Distance)相关推荐

  1. 2020 年百度之星程序设计大赛 - 初赛二

    Poker Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

  2. 1001. Poker (思维 / 模拟)(2020年百度之星*程序设计大赛-初赛二)

    传送门 思路: 嗐,又是这种模拟题,每次都不长记性看数据范围,非得傻傻的去循环模拟T一次才知道思考.呜呜呜太菜了. 既然每次至少拿出m,且求的是最多次数,那我们每次就拿m出来. 先将m * p%上取整 ...

  3. 2020年百度之星·程序设计大赛-初赛一

    Pro.ID 1001 Drink 题解 1002 GPA 题解 1003 Dec 题解 1004 Civilization 1005 Rotate 题解 1006 Matrix 1007 Mosqu ...

  4. 2020 年百度之星·程序设计大赛 - 初赛一 Civilization BFS广搜

    problem Civilization Accepts: 619 Submissions: 2182 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  5. 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理

    problem Dec Accepts: 1284 Submissions: 4572 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  6. 2020 年百度之星·程序设计大赛 - 初赛一 GPA DFS深搜

    problem GPA Accepts: 1554 Submissions: 3947 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...

  7. 2020 年百度之星·程序设计大赛 - 初赛一 Drink

    Problem Description 我们有 nn 种不同的饮料,每种饮料有无限多瓶,第 ii 种饮料一瓶提供 x[i]x[i] 毫升的水分,包含 y[i]y[i] 卡路里. 现在我们需要选择一种饮 ...

  8. 2020 年百度之星·程序设计大赛 - 初赛一题解

    Drink 对于每一种饮料,都可以算出最少需要多少瓶,从而知道最少摄入多少卡路里,从中找个最优值. #include <iostream> #include <cstdio>u ...

  9. 2020年百度之星·程序设计大赛 - 初赛一(前三题)

    文章目录 Drink[贪心] 题目描述 测试样例 解题思路 赛时AC代码 赛后优化AC代码 总结: GPA[枚举] 题目描述 测试样例 解题思路 赛时WA代码 赛时AC代码 总结: Dec[反向dp+ ...

  10. 2020 年百度之星·程序设计大赛 - 初赛三-Discount

    Discount Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Subm ...

最新文章

  1. erdas图像增强步骤_基于erdas的图像增强处理
  2. F(n)完全覆盖中的计数问题
  3. Python (2) 除法
  4. 东南亚Lazada平台3C数码市场概括,手机配件消费电子选品推荐
  5. cls_template.php on line 1072,博客 – 联发多彩网页技术博客
  6. [笔记]cin、cout与scanf、printf的效率差异对比分析
  7. MTKI 驱动(57)---音频参数含义
  8. asp.net mvc4使用DropDownList
  9. php调用拼多多的接口
  10. php文件流播放拖动,自定义实现可以播放暂停、进度拖拽、音量控制及全屏的H5播放器...
  11. Java SE 基础:List 集合列表
  12. AD9371+ZYNQ结构中JESD204B IP核的AXI_STREAM接口数据结构
  13. 计算机专业专科毕业设计题目,专科生计算机专业论文题目大全 专科生计算机专业论文题目哪个好...
  14. Layui select 的动态添加
  15. 三次握手与四次挥手的爱恨情仇
  16. python移动图形工作站_让Python跑得更快
  17. 【豆瓣读书】高分python学习书籍推荐
  18. 安卓手机测评_2018最全安卓模拟器跑分测评
  19. 2021-11-13周报
  20. 在R、Python和Julia中常用的数据可视化技术

热门文章

  1. 【第十届“泰迪杯”数据挖掘挑战赛】C题:疫情背景下的周边游需求图谱分析 问题二方案及Python实现
  2. 基于Citespace和vosviewer的文献信息可视化分析技术
  3. 10分钟搭建一个H5商城,支持微信支付和各平台小程序
  4. 【网络是怎样连接的】—— TCP/IP 传输数据
  5. 帐号 快速看图cad_CAD快速看图
  6. 超平面是什么?——理解超平面(SVM开篇之超平面详解)
  7. 真实网络环境下使用易邮搭建网络邮件服务器并测试通过
  8. 产品需求文档五分钟轻松搞定!这可能史上最全PRD文档模板
  9. CorelDRAWX4的VBA插件开发(七)形状的静态编号和一键转位图
  10. java 回调函数的写法