一些竞赛算法题目及解答(角谷步数,数组非排序正负数分离, 最小方差生成树)

1 角谷步数

你听说过角谷猜想吗?任意的正整数,比如 5, 我们从它开始,如下规则计算:如果是偶数,则除以2,如果是奇数,则乘以3再加1.如此循环,最终必会得到“1” !比如 5 的处理过程是:5168421一个正整数经过多少步才能变成1, 称为角谷步数。对于5而言,步数也是5对于1,步数为0本题的要求是,从标准输入给定一个整数n(1<n<300)表示角谷步数求满足这个角谷步数的最小的正整数例如:输入:3则输出:8输入:4则输出:16输入:7则输出:3

int ComputStep(unsigned int n)
{
   int count=0;
   if(n==1) return 0;
   int nStep=0;
   while(n>1){        
      if(n%2==0)
        n=n/2;
      else
        n=n*3+1; 
   	  nStep++;
   	  if(nStep>300) break;
   }
   return nStep;
}
int aStep[65005]={0};

unsigned int GetFromStep(int nStep)
{
	unsigned int i=0;
	for(i=0;i<65005;i++){
	   if(aStep[i]==nStep) break;
	}
	return i;	
}
main()
{   

   unsigned int i=2;
   for(i=2;i<=65000;i++){
	  aStep[i] = ComputStep(i);
	  printf("%d: %d\n",i,aStep[i]);
   }
   printf("%u\n",GetFromStep(10));
   printf("%u\n",GetFromStep(20));
   printf("%u\n",GetFromStep(100));
   printf("%u\n",GetFromStep(290));
   printf("%u\n",GetFromStep(298));
}
2 不用排序算法分离数组中的负数,0和正数
#include <stdlib.h>
#include <stdio.h>
#define N 10
int main(void)
{
   int p=0,q=N-1,a[N]={2,-5,-89,75,0,-89,0,93,48,0};
   int i,temp;
   while(p<=q){
      if (a[p]<0) {p++;continue;}
      if (a[q]>0) {q--;continue;}
      if (a[p]>0&&a[q]<0){
         temp=a[p]; a[p]=a[q]; a[q]=temp;
         p++; q--; continue;
      }
      if (a[p]==0){
      // from p+1 to q, find a nege num
        for(i=p+1;i<=q;i++)
          if(a[i]<0){
            temp=a[p]; a[p]=a[i]; a[i]=temp;
            break;
          }
        p++;
        continue;           
      }
      if (a[q]==0){
        for(i=q-1;i>=p;i--)
          if(a[i]>0){
            temp=a[q]; a[q]=a[i]; a[i]=temp;
            break;
          }
        q--;
        continue;
      }
   } 
   for(i=0;i<N;i++)
      printf("%4d",a[i]);      
   system("pause");
}

蓝桥杯模拟试题答案及简要说明
http://tieba.baidu.com/p/2244366307  有关于分酒问题的解答

4 最小方差生成树


给定带权无向图,求出一颗方差最小的生成树。
输入格式
输入多组测试数据。第一行为N,M,依次是点数和边数。接下来M行,每行三个整数U,V,W,代表连接U,V的边,和权值W。保证图连通。n=m=0标志着测试文件的结束。
输出格式
对于每组数据,输出最小方差,四舍五入到0.01。输出格式按照样例。
样例输入
4 5
1 2 1
2 3 2
3 4 2
4 1 1
2 4 3
4 6
1 2 1
2 3 2
3 4 3
4 1 1
2 4 3
1 3 3
0 0
样例输出
Case 1: 0.22
Case 2: 0.00
数据规模与约定
1<=U,V<=N<=50,N-1<=M<=1000,0<=W<=50。数据不超过5组。

做法:枚举最小生成树可能的边权平均值,将边权设置为原边权减去平均值的平方,然后求最小生成树。


for 每一个n-1条边的组合 in 所有的边 (n为节点的数量) 

if ( n-1条边包含了n个节点 ) // 有效组合

计算边平均值 m

                for (每个边)  new_w = (w-m)^2; // 原图不改变

               计算new_w的图对应的最小生成树,并计算代价

比较历史代价,保留最小的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值