• 题目:整数选择


    题目描述

    这是一个经典问题。原来的问题是关于树林中的树叶的,这里量化一下,改为整数选择问题。现有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 }
  • 相关阅读:
    集训总结
    目前世界四大杀毒软件各自的特点
    俺们家老祖宗是搞音乐的
    灰姑娘
    自欺欺人的ie7pro去掉msnlivespaces的顶部广告图片
    利用工具及api接口写博文
    在C#中,异步调用的WebService、Socket及新建线程中操作主线程中UI的方法
    Ubuntu 12.04下载址
    js与php互传参数
    php使用strstr函数 ,判断字符串A中是否含有字符串B
  • 原文地址:https://www.cnblogs.com/noip/p/2349427.html
Copyright © 2020-2023  润新知