05:Cave Cows 1 洞穴里的牛之一

总时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
262144kB
描述

很少人知道其实奶牛非常喜欢到洞穴里面去探险。

洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间

至多只有一条双向通道.有K(1≤K≤14)个洞室,里面放有1捆干草.牛吃1捆干草,体重指数就会增加1.

贪吃的贝茜要到洞窟里面探险.她希望能吃尽量多的干草,但每条通道有一个宽度阈值,如果体重指数超过相应的阈值,贝茜就会被卡祝她从洞窟1出发,体重指数为0.在洞里溜达一圈后,她要返回洞窟1.    那她最多能吃多少捆干草呢?注意,贝茜经过一个洞室,不一定非要吃掉里面的干草.

输入
第1行输入N,M,K,之后K行每行一个整数,表示在这个洞室放有一捆干草;接下来M行每行三个整数,表示一条双向通道的起点终点和宽度阈值.
输出
最多能吃掉的干草数.
样例输入
6 7 5
1
2
3
4
5
1 2 3
3 6 2
6 2 10
2 4 1
5 1 1
4 5 1
1 6 1
样例输出
4
来源
USACO 2004 Open Orange
思路:贪心,把每个稻草的阈值都排一个序,能吃的就吃
注意几个细节:
1、要特判一号洞穴有艹的情况
2.、最后要写>

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<queue>
 6 using namespace std;
 7 const int MAXN=4001;
 8 const int maxn=0x3f;
 9 void read(int &n)
10 {
11     char c=‘+‘;int x=0;bool flag=0;
12     while(c<‘0‘||c>‘9‘){c=getchar();if(c==‘-‘)flag=1;}
13     while(c>=‘0‘&&c<=‘9‘)
14     x=(x<<1)+(x<<3)+c-48,c=getchar();
15     flag==1?n=-x:n=x;
16 }
17 int n,m,k;
18 struct node
19 {
20     int have;
21     int need;
22     int pos;
23 }a[MAXN];
24 int map[MAXN][MAXN];
25 int dis[MAXN][MAXN];
26 int comp(const node &a,const node &b)
27 {
28     if(a.have==b.have)
29         return a.need<b.need;
30     else
31         return a.have>b.have;
32 }
33 int main()
34 {
35     read(n);read(m);read(k);
36     int num=k;
37     for(int i=1;i<=k;i++)
38     {
39         int p;
40         read(p);
41         a[p].have=1;
42         a[i].pos=i;
43     }
44     memset(map,maxn,sizeof(map));
45     for(int i=1;i<=m;i++)
46     {
47         int x,y,z;
48         read(x);read(y);read(z);
49         map[x][y]=z;
50         map[y][x]=z;
51     }
52
53     for(int i=1;i<=n;i++)
54         map[i][i]=0;
55
56     for(int k=1;k<=n;k++)
57         for(int i=1;i<=n;i++)
58             for(int j=1;j<=n;j++)
59                 if(map[i][j]<maxn)
60                     map[i][j]=max(map[i][j],min(map[i][k],map[k][j]));
61                 else
62                     map[i][j]=min(map[i][k],map[k][j]);
63
64     for(int i=1;i<=n;i++)
65         if(a[i].have)
66             a[i].need=map[1][i];
67
68
69     sort(a+1,a+n+1,comp);
70
71     int now=0;
72     int flag=0;
73     for(int i=1;i<=num;i++)
74     {
75     //    if(a[i].have==0)break;
76         if(a[i].have&&a[i].pos==1)
77         {
78             flag=1;
79             continue;
80         }
81         if(a[i].need>now)
82             now++;
83
84     }
85     if(flag==1)
86         now++;
87     printf("%d",now);
88     return 0;
89 } 

时间: 2024-10-06 01:49:17

05:Cave Cows 1 洞穴里的牛之一的相关文章

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 21  Solved: 18[Submit][Status][Discuss] Description 洞窟里有一道长长的通道.它由N(1≤N≤25000)段道尾相连构成,编号分别为1到N.每个通道有一个阈值,其范围在[1,10^9]依次通过i..j的通道,那奶牛的体重指数就不能超过i..j通道中阈值的最小值.贝茜有Q

Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 64  Solved: 37[Submit][Status][Discuss] Description 很少人知道其实奶牛非常喜欢到洞穴里面去探险. 洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间 至多只有一条双向通道.有K(1≤K≤14)个洞室,里面放有1捆干草.牛吃1捆

bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一*

bzoj3380[Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 题意: 给一个无向图,每一条边都有一个阈值,有一些点有草.牛从点1出发,每当它到达有草的点可以选择吃或不吃,如果吃的话体重加1.对于边如果它的阈值小于牛的体重,则此边不可通过.求牛走一圈回到点1的最大体重.有草节点数≤14.点数≤100,边数≤1000. 题解: f[i][S]表示当前点为i,草状态为S的状态能否达到.具体看代码. 代码: 1 #include <cstdio> 2 #include <

bzoj3382[Usaco2004 Open]Cave Cows 3 洞穴里的牛之三*

bzoj3382[Usaco2004 Open]Cave Cows 3 洞穴里的牛之三 题意: n个点,求最远曼哈顿距离.n≤50000. 题解: 曼哈顿距离转切比雪夫距离(点(x,y)变为点(x+y,x-y)),然后输出最大横坐标-最小横坐标与最大纵坐标-最小纵坐标的较大值即可. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(in

bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四*

bzoj3383[Usaco2004 Open]Cave Cows 4 洞穴里的牛之四 题意: 平面直角坐标系有n个点,从(0,0)出发,从一个点上可以跳到所有与它横纵坐标距离都≤2的点上,求最少步数使得纵坐标为T. 题解: 先用set存下所有的点.在做dp的时候把所有横纵坐标与当前节点距离≤2的节点都在set中查找,如果可以查到则可以转移到那个节点. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algor

bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*

bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二 题意: RMQ问题.序列长度≤25000,问题数≤25000. 题解: 倍增. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 #define maxn 25100 6 using namespace

P3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

还是蛮简单的一道题,首先dfs一遍,在所有能到达放有干草的洞穴的所有路径中,找出路径上最小伐值的最大值,按这个值由小到大,再来一遍贪心就行了,能放就放,不能放拉倒(也可以理解为,不能放把最前一个删了). 但是如果题目改为每个洞穴不止一堆干草的话,也是没有问题的,只要在队列上在维护一个小根堆,判断队列中最小的干草堆是否比当前小,小则替换,否则不变. 1 const maxn=200; 2 type 3 node=record 4 f,t,w:longint; 5 end; 6 var n,i,j,

P3381: [Usaco2004 Open]Cave Cows 2 洞穴里的牛之二

这题..思维上远没有上一题复杂,是一个裸的RMQ..利用倍增就可以解决了. 1 var n,q,i,j,f,t,c:longint; 2 a:array[0..20,0..25001] of longint; 3 function min(a,b:longint):longint; 4 begin 5 if a>b then exit(b) 6 else exit(a); 7 end; 8 begin 9 readln(n,q); 10 for i:=1 to n do 11 readln(a[

P3382: [Usaco2004 Open]Cave Cows 3 洞穴里的牛之三

首先,我们先确定,最长的曼哈顿距离只可能为 x1+y2-(x2+y2) 和 x1-y1-(x2-y2) 所以我们只需要维护四个值, 分别代表 max(x+y) ; max(x-y) ; min(x+y) ; min(x-y) ; 因此答案也就是 max(max(x+y)-min(x+y),max(x-y)-min(x-y)). 1 const maxn=3000000; 2 var maxadd,minadd,maxdec,mindec,i,a,b,n:longint; 3 function m