微策略面试题---关于权重

M_萌面超人 2011-05-23 07:58:12
我的思路:
给定一个N个整数元素的数组,元素分别为A1, A2, A3....AN,每个元素分别对应一个权重W1(小于1的float), W2,W3....WN, 其和为1.找出其中一个元素Ak,使所有小于Ak的元素的权重之和小于1/2,所有大于Ak的元素的权重之和>=1/2.


(1)将该数组按元素的值得大小升序排列;

(2)

sum = w[1];//小于Ak的元素的权重之和

for(k=2;k<=n;k++)

{

if(sum < 1/2 && sum + w[k] <= 1/2)

return A[k];

sum += w[k];

}

请问我这样的做法有没有什么问题?有没有更好的方法?
...全文
528 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hackbuteer1 2011-08-13
  • 打赏
  • 举报
回复
楼主的思路是对的,只是描述的时候有点问题,首先将该数组按元素的值的大小升序排列,同样的那个权值数组也要对应的进行排序,因为原先的那个数组的下标和权值数组的下标是相对应的,如果权值数组不跟着变化的,那么就无法知道某一个数的权值是多少了,就无法对应起来了。。
另外就是,那个sum有可能会大于1/2,这个时候就直接返回-1,表示没有找到就可以了。。
sum = w[1];//小于Ak的元素的权重之和
for(k=2;k<=n;k++)
{
if(sum>1/2)
return -1;
if(sum < 1/2 && sum + w[k] <= 1/2) //sum < 1/2 保证使所有小于Ak的元素的权重之和小于1/2
//sum + w[k] <= 1/2,使得小于等于Ak的元素权重之和小于等于1/2,也就是所有大于Ak的元素的权重之和>=1/2.
return A[k];
sum += w[k];
}
killua_eye 2011-08-04
  • 打赏
  • 举报
回复
楼主没记错题吗 - -
“有大于Ak的元素的权重之和>=1/2.”应该是<=吧

不然直接返回A1, A2, A3....AN中最小元素好了- -
M_萌面超人 2011-05-24
  • 打赏
  • 举报
回复
Ak应该是不唯一的吧。。。。
ryfdizuo 2011-05-23
  • 打赏
  • 举报
回复
只能想到排序了,A数组和W数组同时要排序。
Ak不唯一吧?
we_sky2008 2011-05-23
  • 打赏
  • 举报
回复
我理解为权重就是该元素的个数占总个数的百分比了
M_萌面超人 2011-05-23
  • 打赏
  • 举报
回复
Ak按题目的意思是既不属于左边也不属于右边的。。。
M_萌面超人 2011-05-23
  • 打赏
  • 举报
回复
Ak表示的是元素的值,每个元素对应一个小于1的浮点数的权值,楼上两位是不是都没认真看题目额?
we_sky2008 2011-05-23
  • 打赏
  • 举报
回复
“使所有小于Ak的元素的权重之和小于1/2,所有大于Ak的元素的权重之和>=1/2.”
Ak元素要算在那边?
如果是算在大于等于的那边的话,只要求出中间的那个值就可以了
如果是算在小于等于的那边的话,要先求出中间的值,然后再找到比这个值小的第一个数
we_sky2008 2011-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 we_sky2008 的回复:]
其实求出中间元素的前一个元素的值就可以了

C/C++ code

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
int a[] = {9, 1, 5, 4, 2, 3, 7, 4, 2, 6, 8, 3, 7};

int *result = nt……
[/Quote]
不好意思,刚才的代码是错误的!更正如下:

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
int a[] = {9, 1, 5, 4, 2, 3, 7, 4, 2, 6, 8, 3, 7};

nth_element(a, a + (sizeof(a) / sizeof(a[0]) / 2 - 1), a + sizeof(a) / sizeof(a[0] / 2));
cout<<*(a + (sizeof(a) / sizeof(a[0]) / 2 - 1))<<endl;

return 0;
}

we_sky2008 2011-05-23
  • 打赏
  • 举报
回复
其实求出中间元素的前一个元素的值就可以了

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
int a[] = {9, 1, 5, 4, 2, 3, 7, 4, 2, 6, 8, 3, 7};

int *result = nth_element(a, a + (sizeof(a) / sizeof(a[0]) / 2 - 1), a + sizeof(a) / sizeof(a[0] / 2);

return 0;
}

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧