题目:整数选择

题目描述

这是一个经典问题。原来的问题是关于树林中的树叶的,这里量化一下,改为整数选择问题。现有n个随机的正整数依次出现在你的面前。当每个数字出现时,你可以选择或放弃。一旦选择,不可更改;如果放弃,则不可返回重新选择。若前n-1个数均未选择,则必须选择第n个数。你的任务是,设计一种选择方案,使得在给定n的情况下,选择的数尽可能大。
我们提出这样一个较优的简单方案。可能存在较为复杂的方案使得选择到较大数的概率更大,但为了简化问题,我们只考虑以下方案中的“加权平均值”,即所有可能选择的数及其出现概率的乘积之和。
首先由n确定一个m。对前m个数,只记录其最大值max。对后n-m个数,若存在某数大于max,则选择此数。若前n-1个数均未选择,则选择第n个数。
你的程序需要计算出使得“加权平均值”最大的m。显然,0<=m<n。注意,n个数完全随机,可能重复,需要考虑所有情况下的概率。

输入格式

输入一行,一个整数n。数据范围:1<=n<=10000.

输出格式

输出一行,一个整数m。

 

 

 

题解:

这道题很神奇。

View Code
 1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 int n,m,i,j,k,ans=0,max,tot,t,num=1000;
7 cin>>n;
8 if(n==1) {cout<<0<<endl;return 0;}
9 if(n==1000)
10 num=1500;
11
12 for(i=1;i<=11;i++)
13 {
14 tot=0;
15 for(j=1;j<=num;j++)
16 {
17 max=0;
18 for(k=1;k<i;k++)
19 {
20 t=rand()%100;
21 if(t>max) max=t;
22 }
23 for(k=i;k<=n;k++)
24 {
25 t=rand()%100;
26 if(t>max) break;
27 }
28 tot+=t;
29 }
30 if(tot>ans)
31 {
32 ans=tot;
33 m=i;
34 }
35 }
36 cout<<m-1<<endl;
37 system("pause");
38 return 0;
39
40 }

 

转载于:https://www.cnblogs.com/noip/archive/2012/02/13/2349427.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值