ECUST 09年 校赛个人赛第三场部分解题报告(A,D,F,I)
校赛个人赛第三场部分解题报告(A,D,F,I)
这次我完成了四道题分别是A,D,F,I
一大半时间我都花在了A上,我犯了很究级的错误
首先是VC6.0的algorithm里没有min函数,而我用min做变量名导致CE4次,找了半天才找出来
其次是我的最短路算法中错误和初始化错误交替出现导致的6次WA
A. The K-th City
A题的大意是给出几个城市之间的距离,要求算出第k远的城市因为数据量较小,可以用floyd或dijkstra算法
floyd版:
#include<iostream>
#include<algorithm>
using namespace std;
struct Pos
{
long pos;
long dis;
};
bool cmpFun(Pos a,Pos b)
{
if(a.dis == b.dis)
return a.pos < b.pos;
else
return a.dis < b.dis;
}
Pos pos[201];
long mini[201][201];
int main()
{
long n,m;
while(cin>>n,n)
{
cin>>m;
int i,j,k;
for(i = 0 ; i < n ; i ++)
{
mini[i][i] = 0;
for(j = i + 1 ; j < n ; j ++)
mini[i][j] = mini[j][i] = 100000000;
}
while(m --)
{
scanf("%d %d %d",&i,&j,&k);
if(mini[i][j] > k)
mini[i][j] = mini[j][i] = k;
}
for (k=0;k<n;k++)
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (mini[i][k]+mini[k][j]<mini[i][j])
mini[i][j] = mini[j][i] =mini[i][k]+mini[k][j];
for(i = 1 ; i < n ; i ++)
{
pos[i - 1].pos = i;
pos[i - 1].dis = mini[0][i];
}
sort(pos,pos + n - 1 ,cmpFun);
cin>>i;
cout<<pos[i - 1].pos<<" "<<pos[i - 1].dis<<endl;
}
return 0;
}dijkstra版:
D. City Mapping
D题是按输入的方向走,输出走过的路径和路径的模式(横向街道,纵向街道,十字路口)
这题只要纯模拟就能过
代码:
F. Tetris
F是简单的俄罗斯方块:
要求按顺序输入方块的其始位置和终点位置,算出最高点
这题可以列一个转移方程,
令第i个方块的最高点为a[i]
=> a[i] = max{a[k] + h[i]}其中h[i]为第i个方块的高度,k= s[k]
或 s[i] <= s[k] && e[i] >= e[k]
代码如下:
I. Girl Friend
I题比较有意思,是帮一个倒霉孩子找女朋友,要求概率*好感度(暂且这么翻译吧)
这是DP问题,令每个女孩的好感度为s[i],成为女朋友的概率为pl[i],第一个见面的美女的最大好感度为a[i]
=>a[i] = max{a[i + 1] (1 – pl[i]) + s[i] pl[i] , a[i + 1]}复杂度O(n)
具体代码如下:
Last updated
Was this helpful?