123
返回列表 发新帖
楼主: glambertjay
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 被表弟的高中竞赛题难住了

🔗
pphuangyi 2021-2-18 00:25:23 | 只看该作者
全局:
不知道小帅 发表于 2021-2-17 23:00
可以继续的。就是double类型也无所谓,可以把精度控制的,就是你二分的边界可以是double,然后写成这样, ...

明白了!感谢感谢!

评分

参与人数 1大米 +1 收起 理由
glambertjay + 1 赞一个!

查看全部评分

回复

使用道具 举报

全局:
pphuangyi 发表于 2021-2-18 00:25
明白了!感谢感谢!

没事。。刚刚打错了,应该是大于tol。不是小于。然后你如果想测验的话,可以用IDE来写一些test,因为这个题目的暴力解非常容易写,除了耗时长一点之外。你可以写一份暴力解,然后写一份这个解法,生成随机数据,看下这个解法和暴力解给的结果是否匹配,这样就可以知道写得对不对了。

评分

参与人数 1大米 +1 收起 理由
glambertjay + 1 赞一个!

查看全部评分

回复

使用道具 举报

🔗
BobbyBear 2021-2-18 04:07:36 | 只看该作者
全局:
不知道小帅 发表于 2021-2-16 20:29
这个题目我的想法是二分。二分的思路可以参考leetcode的378题,也就是我们猜一个数, ...
prefix sum用得漂亮!

评分

参与人数 2大米 +2 收起 理由
不知道小帅 + 1 赞一个
glambertjay + 1 赞一个!

查看全部评分

回复

使用道具 举报

🔗
twtypsj 2021-2-19 02:50:51 | 只看该作者
全局:
本帖最后由 twtypsj 于 2021-2-19 02:54 编辑

有一个问题没有明确,就是数组是否是排好序的,题目里给的1,2,3是排好序的。

假设无序的状态,想法是用heap保存平均值和起始index,终止index,window的和。比如这样
{ave, {start, end, sum}}
每次从heap里pop出一个,分别在start-1和end+1尝试,重新放回heap中。循环K次的到结果。

没有做很多测试,只是大概写了个思路,不知道数据量大了以后还能不能满足条件
大概代码长这个样子:
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;

  5. vector<double> findKSmallestAve(vector<int>& input, int K)
  6. {
  7.     priority_queue<pair<double, vector<int>>, vector<pair<double, vector<int>>>, greater<pair<double, vector<int>>>> pq;
  8.     vector<vector<bool>> visited(input.size(), vector<bool>(input.size()));
  9.     for(int i=0;i<input.size(); ++i)
  10.     {
  11.         pq.push({input[i], {i,i,input[i]}});
  12.         visited[i][i] = true;
  13.     }
  14.    
  15.     vector<double> res;
  16.     for(int i=0; i<K && !pq.empty(); ++i)
  17.     {
  18.         res.push_back(pq.top().first);
  19.         int start = pq.top().second[0];
  20.         int end = pq.top().second[1];
  21.         int sum = pq.top().second[2];
  22.         pq.pop();
  23.         if(start>0 && !visited[start-1][end])
  24.         {
  25.             pq.push({ (double)(sum+input[start-1])/(end-start+2), {start-1, end, sum+input[start-1]}});
  26.             visited[start-1][end]=true;
  27.         }
  28.         if(end<input.size()-1 && !visited[start][end+1])
  29.         {
  30.             pq.push({(double)(sum+input[end+1])/(end-start+2), {start, end+1, sum+input[end+1]}});
  31.             visited[start][end+1]=true;
  32.         }
  33.     }
  34.     return res;
  35. }

  36. int main()
  37. {
  38.     vector<int> input{2,1,3};
  39.    for(auto i : findKSmallestAve(input, 6)) cout << i << ", ";
  40.    
  41.    return 0;
  42. }
复制代码
[i][i][i]

顺便求个大米
[/i][/i][/i][/i][/i][/i][/i]
回复

使用道具 举报

全局:
glambertjay 发表于 2021-2-17 12:49
很合理!太厉害了!我的等级还远远不够竞赛题😭😭

话说楼主有没有这个题目的online judge啊?想写写试试。
回复

使用道具 举报

全局:
不sort,试试用priority queue呢?
回复

使用道具 举报

🔗
maxliu 2021-2-19 04:29:44 | 只看该作者
全局:
Vbloody 发表于 2021-2-17 02:00
我文科生……那天看了个初中数学题,也不能算竞赛题吧,我特么做不来………连题目都没看明白,气的我赶紧点 ...

确实 题目没看明白没事 奶茶得喝!
回复

使用道具 举报

🔗
 楼主| glambertjay 2021-2-19 07:38:38 来自APP | 只看该作者
全局:
不知道小帅 发表于 2021-02-18 11:25:27
话说楼主有没有这个题目的online judge啊?想写写试试。
没,得要有他们内部的账号才能测
回复

使用道具 举报

全局:
glambertjay 发表于 2021-2-19 07:38
没,得要有他们内部的账号才能测

这样子啊,那他写了吗?这种做法过不过得了啊?
回复

使用道具 举报

🔗
 楼主| glambertjay 2021-2-19 08:38:37 来自APP | 只看该作者
全局:
不知道小帅 发表于 2021-02-18 16:12:06
这样子啊,那他写了吗?这种做法过不过得了啊?
现在过了contest时间不让跑了,不过我自己拿极限情况跑下来没超time limit
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表