没有方法的算法代码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了没有方法的算法代码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3358字,纯文字阅读大概需要5分钟。
内容图文
8月分都过半了,最近两个月对代码的激情是越来越少.一方面是由于自己本来忙装修的事情,更主要的原因是我发现自己对代码越来越冷淡了,没有什么感觉了.而且新东些更新太快,我工作几年了没有在工作中使用过ef,mvc这些东西,刚出来的时候主要是webform,后面就是现在,主要也是一些C#的基本语法算法,然后就是sqlserver数据库,现在还觉得在自己身上的就是一些语法,算法,数据库方面的一些东西了,感觉没有什么大的进步.前段时间对项目管理热了一段时间,不过最近还是慢慢的退烧了,反而对其它的兴趣爱好这些用的时候更多.为毛呢?为毛呢?
对于算法的热情我认为还是没有减少,每次看到一算法题目,或者有人问到的算法问题,只要时间充足还是会想办法练练手的.今天写了一段简单的算法代码,先把问题列出来.大致是这样的
枪上有三种值,初始值,X2操作 /2操作(我觉得这个操作可以不要,看了后面就知道了),然后敌人数量N,每个敌人要被消灭所需要的能量余额必须是Xi,这里有点复杂,等会看例子.现在N在[0,10000],Xi[0,10000],后面发贴楼主把范围改大到1000000了.问题:要求设置一个初始值,使得消灭敌人所需的能量最小.看下面例子
1.比如有两个敌人N=2,余值X1=3,X2=5,解:初始值设置3,那么对第一个敌人用0点能量,然后按X2操作,对第二个敌人就用1点能量.每次打完一个敌人,能量都会变为初始值.最后所消耗1点的能量
2.N=3,X1=1,X2=3,X3=4,那么初始值为1,消耗分别为0,1,0,总的消耗为1.
如上面所列出就是要求初始值和总消耗能量.
目前为至,我没有想到有求最优解的算法.只是一个穷举的方式,一些回复说动态规划等,我完全没有看出这里面可以使用动态规划,动态规划始终要能确定一个公式,一个明确的求最优解的方式才行.其实可以想像就是初始值的不同,引起与敌人余值的差不同,如下图,就是找出这些差当中和最小的
如图这个就像我们微调以前的电视一样,就像实验证里面什么波仪器调节一样,只是通过调节来找出最优的情况,所以我感觉没有合适的算法来解决,所以写了一个大概还算可以的代码来解决.主要优化到的地方是从余值列表中选择最小的和最大的,在这个范围内来找初始值,下面一坨代码.
1 using System; 2 using System.Collections.Generic; 3 using System.Diagnostics; 4 using System.IO; 5 using System.Linq; 6 using System.Runtime.Serialization; 7 using System.Runtime.Serialization.Formatters.Binary; 8 using System.Text; 9 using System.Threading; 10 using System.Threading.Tasks; 11 12 namespace ConsoleApplication1 13 { 14 class Program 15 { 16 17 18 static void Main(string[] args) 19 { 20 A a = new A(); 21 a.Init(10000, 100000); 22 a.Show(); 23 24 Console.WriteLine("k"); 25 Stopwatch sw = new Stopwatch(); 26 sw.Start(); 27 a.Calc(); 28 sw.Stop(); 29 30 Console.WriteLine("初始值:{0},总消耗值:{1},耗时:{2}", a.InitValue, a.Total,sw.Elapsed); 31 32 Console.ReadLine(); 33 } 34 35 36 } 37 38publicclass A 39 { 40public List<int> List = new List<int>(); 41 42publicvoid Init(int n, int max) 43 { 44 Random ran = new Random(); 45while (n > 0) 46 { 47//生成max以内的整数 48 List.Add(ran.Next(max)+1); 49 n--; 50 } 51 } 52 53publicvoid Show() { 54foreach (int a in List) { 55 Console.Write("\t {0}", a); 56 } 57 Console.WriteLine(); 58 } 59 60 61publicint InitValue = 0; 62publicint Total = 0; 63private List<int> sums = new List<int>(); 64 65publicvoid Calc() 66 { 67//1.找出最小值和最大值 O(n) 68int min = List[0]; 69int max = List[0]; 70foreach (var a in List) 71 { 72if (a < min) min = a; 73if (a > max) max = a; 74 } 75 76//2.从最小值开始 依次计算出每个数的结果和O(n^3) 77for (int i = min; i <= max; i++) 78 { 79 InitValue = i; 80int sum = 0; 81foreach (int a in List) 82 { 83 sum += FindCeil(a, i)-a; 84 } 85 sums.Add(sum); 86 } 87 88//3.找出最小的O(n) 89int minsum = sums[0]; 90int mini = 0; 91for (int i = 0; i < sums.Count; i++) 92 { 93if (sums[i] < minsum) 94 { 95 minsum = sums[i]; 96 mini = i; 97 } 98 } 99100 InitValue = min + mini; 101 Total = sums[mini]; 102 } 103104//找出初始值为initValue对于num的最近的一个Ceil值105privateint FindCeil(int num, int initValue) 106 { 107int v = 0; 108for (int i = 0; i < num; i++) 109 { 110 v = initValue * Pow2(i); 111if (v >= num) 112 { 113return v; 114 } 115 } 116return0; 117 } 118119//2的n次方120privateint Pow2(int y) 121 { 122int a = 1; 123if (y == 0) return1; 124elsereturn a << y; 125 } 126 } 127128 }
最后总结一下,算法没有什么总结的,可能在FindCeil这个方法中还有优化的空间. 还有就是从最小值到最大值,是不是还有优化的空间,就是可以不一直找到最大值,找到中间一个值就可以停了,那这里可能就要好一些.
修正错误 ,代码里面我就不去改了,不应该以min~max范围内找初始值,应该以1~max范围找初始值.
原文:http://www.cnblogs.com/gw2010/p/3912164.html
内容总结
以上是互联网集市为您收集整理的没有方法的算法代码全部内容,希望文章能够帮你解决没有方法的算法代码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。