SRM573 Div1Medium Ski Resorts

来源:互联网 发布:数据库软件工程师考试 编辑:程序博客网 时间:2024/06/05 16:43

【分析】
修改,我比较讨厌这个词。
有没有什么贪心的做法?不知道啊。
要改成什么?
问题好像走进了死胡同。我们唯一知道的就是这个点原来的特征值。枚举一下改成它们?试一试吧!
定义dis[i][j]为将i的特征值改成j的特征值。
接下来直接一遍Dijkstra带走!!!
其实我也知道这样说服不了你们。你其实可以模拟一下特征值为:10 20 10(i和i+1相连)
它的答案应该是10,无论将10、20改成15、15还是将将10、20改成16、16,答案都不会变,那我们何不妨将特征值改成我们已知的。
我知道这还是说服不了你们……
这TM其实就是玄学!你要揣摩出题者的意图!一定这样的没错!

【代码】

#include <bits/stdc++.h>#define ll long long#define oo 1e15#define M 55using namespace std;ll dis[M][M],ans=oo;vector<int>st[M];char str[M][M];bool mk[M][M];int n,m,w[M];struct node{    int pre,now;    ll co;    bool operator<(const node &a)const{        return co>a.co;    }};priority_queue<node>q;void Dij(){    for(int i=1;i<=n;i++){        for(int j=1;j<=n;j++)dis[i][j]=oo;    }    while(!q.empty())q.pop();    for(int i=1;i<=n;i++){        node tmp;        tmp.pre=1;        tmp.now=i;        tmp.co=dis[1][i]=abs(w[i]-w[1]);        q.push(tmp);    }    while(!q.empty()){        node tmp=q.top();        q.pop();        int pre=tmp.pre;        int now=tmp.now;        ll co=tmp.co;        if(mk[pre][now])continue;        mk[pre][now]=1;        for(int i=0;i<st[pre].size();i++){            int nxp=st[pre][i];            for(int j=1;j<=n;j++){                int nxn=j;                if(mk[nxp][nxn])continue;                if(w[now]>=w[nxn]){                    ll v=abs(w[nxn]-w[nxp]);                    if(dis[nxp][nxn]>co+v){                        tmp.pre=nxp;                        tmp.now=nxn;                        tmp.co=dis[nxp][nxn]=co+v;                        q.push(tmp);                    }                }            }        }    }}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++){        scanf("%s",str[i]+1);        for(int j=1;j<=n;j++){            if(str[i][j]=='Y')st[i].push_back(j);        }    }    for(int i=1;i<=n;i++)scanf("%d",&w[i]);    Dij();    for(int i=1;i<=n;i++)ans=min(ans,dis[n][i]);    if(ans==oo)puts("-1");    else cout<<ans<<endl;    return 0;}
2 0
原创粉丝点击