A题 ASCII:简单题。定义整型数组,输入数字,输出ASC码。
B题 Fix: 未做。
题目给出平面的个点,某些是固定的,需要加边构造类似三角形的形状,固定其他的点,求出需要加的最小长度,如果无法实现,输出“No Solution”。
C题 Ice-sugar Gourd:题目给出一串只由H,T组成的串,要求最小切几次可以把H,T平均分给两人,并输出切的点的位置,且要求竟可能是切的点下标小。
扫描线
首先,知道最多切两次即可
就是找到两条线,一条含有一半个数的H;另一条含有一半个数的T,
然后慢慢向右移,直到有满足条件的情况,当需要两次的时候,注意输出右边界
例如:
4
HHTT
定义pos=0,从第0个位置开始找,统计pos―pos+n/2之间H的个数sum=2,不等于H总个数的一半,向右移即pos++,继续统计pos―pos+n/2之间H的个数,注意此时sum应减1,除去第一个H,因为它不在pos―pos+n/2范围内。此时sum=1等于H总个数的一半,则在pos和pos+n/2位置分别切一刀。
D题 Lanterns:未做。
题目描述了n 个灯,m个开关,对应的控制关系,求出对于一个给定的最终的灯状态,有多少种控制开关的方法。
E题 New Ground:未做。
题目给出简单多边形的顶点坐标a[0..n-1]
给出另一个相似多边形的两个点b[0],b[1],
且相同下标的点一一对应,求出剩余的点
标称是用复数的乘法和除法来做的,需要理解复数乘法的几何意义
或者 利用 向量的 点积 和 差积 列两个方程,解出x,y
长度平方比为 d = |b[1] - b[0]| / |a[1] - a[0]|
(a[1] - a[0]) . (a[i] - a[1]) = d * (b[1] - b[0]).(b[i] - b[1])
(a[1] - a[0]) * (a[i] - a[1]) = d * (b[1] - b[0])*(b[i] - b[1])
几何题,计算量大,细心认真才可以。
F题 Passage:动态规划。
题目描述了一个人有m百万,去选择n条路,
其中,每条路:
1) 有一个成功逃脱的概率pi。
2) 有一个遇到匪徒的概率qi,遇到匪徒需要花费一百万,重新选择另外的一条路。
3) 有一个无法通过的概率1-pi-qi,必须返回,不需花费。
求最终选最优策略,能够逃脱的概率
先按照 pi/qi 从大到小排序,(貌似这样是最优的选择)
//dp[i][j]表示花费j到达i的概率
ans+=dp[i][j]*pass[i].p;//在这里可以出去,所以ans+=dp[i][j]*Pi
dp[i+1][j]+=dp[i][j]*(1-pass[i].p-pass[i].q);//第i条路无法走
dp[i+1][j+1]+=dp[i][j]*pass[i].q;//走第i条路遇到匪徒
G题 Pseudoforest:未做。
并查集。
题目给伪森林的定义,每一个连通树最多有一个环,求给定图的最大伪森林。
H题 Reversi:描述了翻转棋,给出一个状态,要求算出加一个黑子,最多可以翻几个白子。
我用的暴力搜索。双重循环,外加8个方向上的循环。核心代码如下:
if(check(x,y)&&r[x][y]=='L')
{
cnt++;
x+=dir[k][0];
y+=dir[k][1];
while(check(x,y))
{
if(r[x][y]=='L')
cnt++;
else if(r[x][y]=='D')
{sum+=cnt;break;}
else if(r[x][y]=='*')
break;
x+=dir[k][0];
y+=dir[k][1];
}
}
I题 Robot:未做。
题解 http://hi.baidu.com/pojoflcc/blog/item/3da18231d2558095a8018e7c.html
题解说是典型的矩阵乘法。
J题 Guard:未做。