Vijos P1901 学姐的钱包
2016-11-24 19:13
267 查看
描述
学姐每次出门逛街都要带恰好M元钱, 不过她今天却忘记带钱包了.可怜的doc只好自己凑钱给学姐, 但是他口袋里只有一元钱.
好在doc的N位朋友们都特别有钱, 他们答应与doc作一些交换.
其中第i位朋友说:
如果doc有不少于Ri元钱,
doc可以把手上所有的钱都给这位朋友,
并从这位朋友手中换回Vi元钱,
但是这次交换会浪费Ti的时间.
doc希望可以在最短的时间内换到M元钱(其实是可以大于M的, 因为doc可以存私房钱呢), 否则学姐会生气的!
格式
输入格式
输入数据第一行给定T, 表示总的询问次数.对于每一次询问, 第一行给出两个整数N和M.
之后N行, 每一行给出三个整数Vi, Ri和Ti. (保证Ri<=Vi).
输出格式
对于每一次询问, 首先输出询问的编号, 参见样例输出.之后输出最小需要的时间, 如果不可能完成目标, 则输出-1.
样例1
样例输入1[复制]
3 5 9 5 1 1 10 4 10 8 1 10 11 6 1 7 3 8 4 5 2 1 1 3 2 1 4 3 1 8 4 1 3 10 5 1 3 8 2 5 10 9 2
样例输出1[复制]
Case #1: 10 Case #2: 4 Case #3: -1
限制
对于40%的数据N <= 1500.
对于100%的数据
T <= 5
1 <= N <= 100000.
1 <= M <= 1000000000.
1 <= Ri <= Vi <= 1000000000.
1 <= Ti <= 1000000000.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
离散化+SPFA~
学的王神的做法,真是神奇啊~
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
int T,n,m,c[1000001],tot,fi[1000001],ne[1000001],w[1000001],v[1000001],cnt,totnumcnt;
ll dis[1000001],maxx;
bool b[1000001];
queue<ll> q;
struct node{
int v,r,t;
}a[100001];
void add(ll u,ll vv,ll val)
{
w[++cnt]=vv;v[cnt]=val;ne[cnt]=fi[u];fi[u]=cnt;
}
void findd()
{
memset(dis,127,sizeof(dis));
maxx=dis[0];
q.push(1);b[1]=1;dis[1]=0;
while(!q.empty())
{
int k=q.front();q.pop();b[k]=0;
for(int i=fi[k];i;i=ne[i])
if(dis[w[i]]>dis[k]+v[i])
{
dis[w[i]]=dis[k]+v[i];
if(!b[w[i]])
{
b[w[i]]=1;q.push(w[i]);
}
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(fi,0,sizeof(fi));cnt=tot=0;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;++i)
{
scanf("%d%d%d",&a[i].v,&a[i].r,&a[i].t);
if(a[i].v>m) a[i].v=m;
if(a[i].r>m) a[i].r=m;
c[++tot]=a[i].v;
c[++tot]=a[i].r;
}
sort(c+1,c+tot+1);
tot=unique(c+1,c+tot+1)-c-1;
for(int i=1;i<=n;++i)
{
a[i].v=lower_bound(c+1,c+tot+1,a[i].v)-c;
a[i].r=lower_bound(c+1,c+tot+1,a[i].r)-c;
add(a[i].r,a[i].v,a[i].t);
}
for(int i=2;i<=tot;i++) add(i,i-1,0);findd();
printf("Case #%d: %lld\n",++totnumcnt,dis[tot]==maxx ? -1:dis[tot]);
}
return 0;
}
相关文章推荐
- Vijos P1901 学姐的钱包
- Vijos 1901 学姐的钱包(线段树优化dp)
- Vijos1901 学姐的钱包
- vijosP1901学姐的钱包
- spfa vijos1901 学姐的钱包
- 学姐吃牛排[Vijos1987]解题报告
- vijos1891 学姐的逛街计划(线性规划)
- vijos1904 学姐的幸运数字
- vijos1901 学姐的钱包
- vijos1891 学姐的逛街计划(线性规划)
- 【暴力】vijos P1897 学姐吃牛排
- 2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字
- 【vijos1900】 学姐吃寿司
- 钱包、手机、钥匙
- 女儿,谈恋爱时请带上钱包
- 女大学生,恋爱时请带上你的钱包!
- [导入]女子公交上被窃后自家卫生间内找到钱包
- [双语阅读]研究:有宝宝照片的钱包最易“失而复得”
- 2006年1月9日晚——丢钱包纪念
- vijos 1443 月亮之眼