成功源于积累----波爸

思想决定高度,行动决定成败!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、个面的骰子 标上1 2 3 4 5 6 投掷8次 求出现和的概率最大的数 ,就是这8次的和最有可能是多少

 

应该是28。

(1+2+3+4+5+6)/6=3.5

3.5 * 8 =28

另一种方法是:投两次,这两次的和出现次数最多的7,7*4=28

 

2、全排列 如1 2 3 有 3!词排列方式 输入是:1~50的整数,参数是[a,b),如[33,36)就是 33 34 35

 

#include<iostream>

using namespace std;

void arrange(int arr[], int k, int beginPos)
{
     if(beginPos == k)
     {
              for(int i = 0; i < k; i++)
              {
                      cout << arr[i] << " ";
              }
              cout << endl;
     }
    
     for(int i = beginPos; i < k; i++)
     {
             swap(arr[beginPos], arr[i]);
             arrange(arr, k, beginPos + 1);
             swap(arr[beginPos], arr[i]);
     }
}

void printZuhe(int a, int b)
{
     int num = b - a;
     int array[num];
     for(int i = a; i < b; i++)
     {
             array[i - a] = i;
     }
     arrange(array, num, 0);
}

int main()
{
    printZuhe(33, 36);
    system("pause");
    return 0;
}

 

 

 

题目描述:平面上给你n个点,让你求一个点,到这n点的距离和最小。

解题报告:

         先写好一个判定函数double judge(pint id),表示id这个点的权值,这里的话,权值就是id到其他所有点的距离和。

         随即在给定的范围内生成NUM个点,挑选一个最大的步长T(要求答案点距离随即生成的点小于T)。

         下面就开始循环了:

         1:对于每一个T,扫描第i个随即生成的点。

         2:以这个点为中心,上下左右为T的方框内,随机生成TIM个点(模拟这个点偏移T的距离)。

         3:把i点更新为这TIM点中权值最优的。

         4T *= deta,缩小,如果小于给定的MIN跳出,否则继续从1开始。

         5:最后从NUM点中选取最优的即可。

代码如下:

#include<iostream>

#include<cstring>

#include<vector>

#include<algorithm>

#include<cmath>

#include<cstdio>

using namespace std;

#define NUM 20 //随机生成点的个数

#define TIM 20 //每个点移动的次数

#define RD 1000 //随即乘生成0~1的,精度为1/RD的小数

#define MIN 0.1 //步长T的最小值,比最后坐标要求的精度小一些

#define deta 0.7 //每次循环步长T的缩小程度

int n; //总点数,复杂度X * NUM * TIM * n; XTMIN的循环次数,由deta决定

struct pint

{

    double x, y, val;

    pint(){}

    pint(double x, double y):x(x),y(y){}

}jeo[200], tar[NUM];

double dist(pint a, pint b)

{return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}

//判定函数

double judge(pint id)

{

    double sum = 0;

    for(int i = 0; i < n; i++)

        sum += dist(id, jeo[i]);

    return sum;

}

//获取0~1的小数

double GetDouble()

{return (rand() % (RD + 1)) * 1.0 / RD;}

//获取左下角为a,右上角为b内的随机点

pint GetRand(pint a, pint b)

{

    pint tar = pint(a.x + (b.x - a.x) * GetDouble(), a.y + (b.y - a.y) * GetDouble());

    tar.val = judge(tar);

    return tar;

}

//模拟退火主过程 //MAXT为步长

void jeogia(double MaxT)

{

   for(double T = MaxT; T >= MIN; T *= deta)

       for(int i = 0; i < NUM; i++) for(int j = 0; j < TIM; j++)

       {

           pint tmp = GetRand(pint(tar[i].x - T, tar[i].y - T), pint(tar[i].x + T, tar[i].y + T));

           if (tmp.val < tar[i].val) tar[i] = tmp;

       }

}

int main()

{

    while(scanf("%d", &n) != EOF)

    {

        pint a = pint(100000, 100000), b = pint(-100000, -100000);

        for(int i = 0; i < n; i++)

        {

            scanf("%lf%lf", &jeo[i].x, &jeo[i].y);

            a.x = min(a.x, jeo[i].x); a.y = min(a.y, jeo[i].y);

            b.x = max(b.x, jeo[i].x); b.y = max(b.y, jeo[i].y);

        }

        //随机生成NUM个点

        for(int i = 0; i < NUM; i++) tar[i] = GetRand(a, b);

        //传入步长

        jeogia(max(b.y - a.y, b.x - a.x));

        double ans = -1;

        for(int i = 0; i < NUM; i++)

            if (ans < 0 || tar[i].val < ans)

                ans = tar[i].val;

        printf("%.0f\n", ans);

    }

         return 0;

}

 

度为k的树,度为1的节点个数为n1,度为2的节点个数为n2...度为k的节点个数为nk,求叶子结点的个数

n1+2n2+...+knk -(n1+n2 + ... + nk) +1
=  n2+2n3+...+(k-1)nk + 1

 

http://www.isstudy.com/visualc/3087.html

posted on 2012-05-28 20:57  沙场醉客  阅读(1202)  评论(0编辑  收藏  举报