posted @ 2011-05-22 19:55
05 2011 档案
摘要:题意主要是寻找最长递增子序,每个元素有两个属性,H,W,下一个一定要比上一个的H,W大先排序,再类似最长递增子序的做法,两个for 语句注意点:就是每个元素H,W要比开始给定的大记忆路径的过程就是pre记录法+stack还原View Code #include<iostream>#include<algorithm>#include<stdio.h>#include<stack>using namespace std;struct data{ int no; int w; int h; int add; int pre;}ss[59];////i
阅读全文
摘要:题目的具体做法是参考刘汝佳的《算法艺术与信息学奥赛》,代码倒是自己实现的。大概思路是:1.找出初始状态和目标状态。明显,目标状态就是排序后的状态。2.画出置换群,在里面找循环。例如,数字是8 4 5 3 2 7明显,目标状态是2 3 4 5 7 8,能写为两个循环:(8 2 7)(4 3 5)。3.观察其中一个循环,明显地,要使交换代价最小,应该用循环里面最小的数字2,去与另外的两个数字,7与8交换。这样交换的代价是:sum - min + (len - 1) * min化简后为:sum + (len - 2) * min其中,sum为这个循环所有数字的和,len为长度,min为这个环里面最小
阅读全文
posted @ 2011-05-06 20:45
摘要:如何安排相片,使相片尽量能放入几个给定的箱子里(体积不同),但是条件是,每个箱子里的照片不能相邻:如第一张,第二张不能同时放到一个箱子里,而且第一张与最后一张也不能在一起!!!错了N久,解决方法就是尽量把不能最后放的箱子在前面用掉1.按每个箱子剩余容积排序放入第一张到一个箱子里2.每放入一张照片前,先拿第一张所放入的箱子号去放(为了使第一张与最后一张不能相邻),如不行则再按每个箱子剩余容积排序,选择符合的箱子去放http://codeforces.com/problemset/problem/81/DView Code #include<iostream>#include<c
阅读全文
posted @ 2011-05-05 15:47
摘要:a==ba>b时按: if(a.shu==b.shu) return a.no<b.no; return a.shu<b.shu; a<b时按: if(a.shu==b.shu) return a.no>b.no; return a.shu<b.shu; View Code #include<iostream>#include<cstdio>#include<algorithm>using namespace std;struct data{ int no; int shu;}qun[100009];bool hash[1
阅读全文
posted @ 2011-05-04 21:29
摘要:View Code #include<stdio.h>#include<math.h>__int64 gcd(int a,int b){ if(b==0)return a; else gcd(b,a%b);}int main(){ int c,n; while(scanf("%d%d",&c,&n),c&&n) { __int64 add=0; int i; for(i=1;i<=n;i++) { add+=(__int64)pow(c*1.0,gcd(n,i)*1.0); } if(n&1) //翻转的
阅读全文
posted @ 2011-05-03 22:35
摘要:注意点:class base{protected://抽象类成员变量要用protected,而用private子类明显不可以调用 double x;public: base(double a){x=a;} virtual void s()=0;//加个const就不对了 virtual void v()=0;};View Code #include<iostream>using namespace std;class base{protected: double x;public: base(double a){x=a;} virtual void s()=0;//加个const就
阅读全文
posted @ 2011-05-02 19:57