关于题目颜色……
查看原帖
关于题目颜色……
270529
captain_tiny_rubbishYSNaive楼主2020/10/26 22:58

实在不敢相信,这题居然是绿的 (一个离散建图就该是蓝的了吧) 加上感人的题意 以及70多行的代码……

#include<algorithm>
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int maxn=105;
int end,speed,n;
int shu1[maxn],shu2[maxn];
int dp[maxn][maxn];
int ans;
map<int,int> mp;
int cun[maxn],tot,num;
set<int> dui;
int get(int x,int y)
{
	if(x==y)return 0;
	if(dui.count(x))return 1<<30;
	int k=y;
	for(int i=1;i<=n;i++)
	if(x<shu1[i]&&shu1[i]<k&&(shu1[i]-x)%speed==0)
	k=shu1[i];
	while(k!=y&&dui.count(k))k--;
	if(k==x)return 1<<30;
	return get(k,y)+(k-x+speed-1)/speed;
}
main()
{
	while(true)
	{
		cin>>end;
		if(!end)return 0;
		cin>>speed>>n;
		num=tot=0;
		cun[++tot]=0,cun[++tot]=end;
		mp.clear(),dui.clear();
		memset(shu1,0,sizeof(shu1));
		memset(shu2,0,sizeof(shu2));
		for(int i=1;i<=n;i++)
		{
			cin>>shu1[i]>>shu2[i];
			cun[++tot]=shu1[i],cun[++tot]=shu2[i];
			dui.insert(shu1[i]);
		}
		sort(cun+1,cun+1+tot);
		for(int i=1;i<=tot;i++)
		if(!mp[cun[i]])
		mp[cun[i]]=++num;
		memset(dp,0x3f,sizeof(dp));
		for(int i=1;i<=tot;i++)
		for(int j=i+1;j<=tot;j++)
		{
			int x=cun[i],y=cun[j];
			dp[mp[x]][mp[y]]=get(x,y);
//			cout<<get(x,y)<<" "<<x<<" "<<y<<"xy\n";
		}
		for(int i=1;i<=n;i++)
		dp[mp[shu1[i]]][mp[shu2[i]]]=0;
//		for(int i=1;i<=num;i++)dp[i][i]=0;
//		for(int i=1;i<=num;i++)
//		for(int j=1;j<=num;j++)
//		cout<<dp[i][j]<<" "<<i<<" "<<j<<"dp\n";
		for(int k=1;k<=num;k++)
		for(int i=1;i<=num;i++)
		for(int j=1;j<=num;j++)
		dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
		end=mp[end];
		ans=dp[1][end];
		cout<<ans<<"\n";
	}
}
2020/10/26 22:58
加载中...