省赛打印(除题目)
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. 剪刀 石头 布
有一个关键点是:白天所发生的战争,得出结果,晚上再进行领土扩张。也就是说白天的战争已经有了结果,但是白天不能根据这个结果来进行战争,因为虽然打赢了这个战争,但是敌军仍然占领这座阵地。因为这条规则,才可以保证每天按任意顺序发生战争,得到的结果是一样的。迷惑的同学仔细揣摩下这句话吧,我就是在这里耽误半天,最后才恍然大悟。
所以白天发生的战争得到的结果,需要临时保存起来,晚上根据这个临时的结果进行领土扩张。