欢迎访问我的个人网站==》 jiashubing.cn

省赛打印(除题目)

1.乱码加 ’\0’;

2.char str[100];  gets(str);字符从0开始存  gets(&str[1]);从1开始存

3.三角形知三边求面积

P=(L1+L2+L3)/2;  S=sqrt(P*(P –L1)*(P-L2)*(P-L3)); 按此法可求凸多边形

4.0xffffff 最大的数

5.求相交圆的面积

if((r1+r2)>d && (r1-r2)<d)

{

double a1=acos((r1*r1+d*d-r2*r2)/(2.0*r1*d));

double a2=acos((r2*r2+d*d-r1*r1)/(2.0*r2*d));

S=(a1*r1*r1+a2*r2*r2-r1*d*sin(a1));

}

6.最后纠结题目小点时,注意适时没理解题目意思

Legal合法的 multiplication乘法 puzzle困惑

7.最优子结构是能够用动态规划算法求解的前提

8.doule转int精度损失问题 int num = (int)(f*100+0.0001),这个0.0001根据你需要的精度来设置,是可以改变的

9.用sort排序,而不用qsort排序;吸收'\n'用个gets(s),而不用getchar();

10.int x=(int)(n*100+0.5);double转化成int类型时四舍五入

11.输出%6.2f,这个6表示包含小数点及小数点后面的两位一共占6个字符

12.不要在最后位输出空格,即使你直接拷贝过来时后面有一个空格;

13.# define max(a,b) a>b?a:b  //这样定义max函数,是不是就不用考虑a,b的类型了

14.scanf与gets输入要慎重

15.求最长公共子序列:设d[i][j]为A1,A2...Ai和B1,B2...Bj的LCS长度,则的d[i][j]=max{d[i-1][j],d[i][j-1]},如果A[i]=B[j],d[i][j]=max{d[i][j],d[i-1][j-1]+1},边界条件是最外层为0

16.输入比较特别的,比如先输入n然后有不确定的多组,每组输入n个数,那么可以先输入一个!=EOF,然后接下来的循环少输入一个就好了

17.三维背包问题,动态规划

题目大意:帮两个小偷取得最大价值的珠宝,而且背包不能超重

思路:dp[i][j][k]表示当第一个背包里放重量恰为i,第二个背包里放重量恰为j时,当前物品放在k号背包里所得到的最大价值,k=0表示两个背包都不放

状态转移是:dp[i][j][0] = max(dp[i][j][0],dp[i][j][1],dp[i][j][2]);

      dp[i][j][1] = max(dp[i-w[k]][j][0],dp[i-w[k]][j][2])+v[k];

      dp[i][j][2] = max(dp[i][j-w[k]][1],dp[i][j-w[k]][0])+v[k];

边界条件是:

 dp[0][0][0]=0;  dp[w[0]][0][1] = v[0];  dp[0][w[0]][2] = v[0];

 

18. 题目大意是:给出一个串很长的数,计算这里边的一部分是64倍数的总数,这一部分数字可以是单独的0,除此以外不能含有前导0

思路:2的6次方为64,如果一个数的后6位是64的倍数,那么它的前面加任何数都是64的倍数,这种方法就能求出数字长度大于6的所有数中满足条件的个数,再求出数字长度小于等于6的数中满足条件的个数,相加就好了,注意前导0

19.如果是用C++的sort快排,要用 return strcmp(a1.a,b1.a)<0;  如果用C的qsort排序,要用 return strcmp(a1.a,b1.a);

20.斐波那契数列以最小单位为下标,比如以0.01为下标,哈哈,这是相当不理解的吧

21.三角形中再加一个三角形,那么一共有多少个三角形

     f[0]=0;
     for(i=1;i<501;i++)
         f[i]=f[i-1]+i*(i/2)+i*(i+1)/2-(i/2)*(i/2);
 

22. 题意:求两个字符串两两匹配,不足的用'-'与之匹配所能得到的最大值,每两个字符串匹配的值已经给出

动态规划 其实就是个LCS,最长公共子序列

令f(i, j)表示序列x[0...i]和序列y[0...j]的相似度(即等长匹配的最大得分),arr[a][b]表示表中所示的字符(a,b)对的得分,则可以得如下递推式:f(i, j)=max{f(i-1, j-1)+arr[a[i-1]][b[j-1]], f(i, j-1)+arr['-'][y[j]]  ,f(i-1, j)+arr[x[i]]['-']

边界条件是:当i==0 j==0时,f[i][j] = 0 ; 当i==0 j!=0时,f[i][i] = f[i][j-1] + arr['-'][b[j-1] ]; 当i!=0 j==0时 f[i][j] = f[i-1][j] + arr[a[i-1]]['-'];

 

23.数字的单调回文分解

观察12的单调回文分解形式中所有开头和结尾均为2的分解:

282  22422  222222  2442

假设用d[n][i]表示将n分解成单调回文中最左边的数为i的个数,例如d[12][2]表示将12分解成单调回文中最左边的数为2的个数,它的值等于以下各项之和:

d[12-2*2][2]:已经将12分解成了2...2这种形式,所以这项表示将8分解成单调回文中最左边的数为2的个数

d[12-2*2][3]:这项表示将8分解成单调回文中最左边的数为3的个数

...

递推公式为:d[n][i] += d[n-2*i][j] (0<i<n/3  0<j<=i)

初始条件:d[i][i] = 1 (0<i<=n)  如果i是偶数,比如12可以表示成{6,6},所以d[i][i/2] = 1;

24. s.clear(); //map函数没有这个的话,会出现Segmentation Fault,是下标出错

25.

3

a 1

b 1

c 1

abc

bca

本题的算法思想与LCS问题类似。设输入的2个字符串s1[0...n]和s2[0...m],另f(i,j)表示子串s1[0...i]和s2[0...j]对应的最大得分,则有DP递推式

f(i,j)=max{f(i-1,j-1)+(x[i]==y[j])?v(x[i]):0,f(i,j-1),f(i-1,j)},(v(c)表示字符c的分值),所以最大得分便是f(n,m)。

 

26. 剪刀 石头 布

有一个关键点是:白天所发生的战争,得出结果,晚上再进行领土扩张。也就是说白天的战争已经有了结果,但是白天不能根据这个结果来进行战争,因为虽然打赢了这个战争,但是敌军仍然占领这座阵地。因为这条规则,才可以保证每天按任意顺序发生战争,得到的结果是一样的。迷惑的同学仔细揣摩下这句话吧,我就是在这里耽误半天,最后才恍然大悟。

所以白天发生的战争得到的结果,需要临时保存起来,晚上根据这个临时的结果进行领土扩张。

 

 

posted @ 2013-05-10 15:02  贾树丙  阅读(177)  评论(0编辑  收藏  举报