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?