BZOJ 2020 [Usaco2010 Jan]Buying Feed,II:贪心【定义价值】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2020

题意:

  FJ开车去买K份食物。

  如果他的车上有X份食物,每走一里就花费X元。

  FJ的城市是一条线,总共n里路,有n+1个地方,标号0~n。

  FJ从0开始走,到n结束(不能往回走),要买m份食物。

  城里有t个商店,每个商店的位置是x[i](一个点上可能有多个商店),有f[i]份食物,每份c[i]元。

  问到达n并买m份食物的最小花费。

 

题解:

  贪心。

  每一份食物实际的话费 = 它的价格 + 剩下的路程

  所以按照实际花费排序,然后依次选够m个就好啦。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <vector>
 5 #include <queue>
 6 #define MAX_N 100005
 7 #define INF 10000000
 8 
 9 using namespace std;
10 
11 struct Edge
12 {
13     int dest;
14     int len;
15     Edge(int _dest,int _len)
16     {
17         dest=_dest;
18         len=_len;
19     }
20     Edge(){}
21 };
22 
23 struct Node
24 {
25     int idx;
26     int dis;
27     Node(int _idx,int _dis)
28     {
29         idx=_idx;
30         dis=_dis;
31     }
32     Node(){}
33     friend bool operator > (const Node &a,const Node &b)
34     {
35         return a.dis>b.dis;
36     }
37 };
38 
39 int n,m;
40 int s,t1,t2;
41 int ans=INF;
42 int dis[MAX_N];
43 vector<Edge> edge[MAX_N];
44 priority_queue<Node,vector<Node>,greater<Node> > q;
45 
46 void djikstra(int start)
47 {
48     memset(dis,-1,sizeof(dis));
49     dis[start]=0;
50     q.push(Node(start,0));
51     while(!q.empty())
52     {
53         Node now=q.top();
54         q.pop();
55         if(dis[now.idx]<now.dis) continue;
56         for(int i=0;i<edge[now.idx].size();i++)
57         {
58             Edge temp=edge[now.idx][i];
59             if(dis[temp.dest]==-1 || dis[temp.dest]>dis[now.idx]+temp.len)
60             {
61                 dis[temp.dest]=dis[now.idx]+temp.len;
62                 q.push(Node(temp.dest,dis[temp.dest]));
63             }
64         }
65     }
66 }
67 
68 void read()
69 {
70     cin>>m>>n>>s>>t1>>t2;
71     int a,b,v;
72     for(int i=0;i<m;i++)
73     {
74         cin>>a>>b>>v;
75         edge[a].push_back(Edge(b,v));
76         edge[b].push_back(Edge(a,v));
77     }
78 }
79 
80 void solve()
81 {
82     djikstra(t1);
83     ans=min(ans,dis[s]+dis[t2]);
84     djikstra(t2);
85     ans=min(ans,dis[s]+dis[t1]);
86 }
87 
88 void print()
89 {
90     cout<<ans<<endl;
91 }
92 
93 int main()
94 {
95     read();
96     solve();
97     print();
98 }

 

posted @ 2017-10-05 16:28  Leohh  阅读(371)  评论(0编辑  收藏  举报