USACO 2007 NOV Sunscreen

题目

题目描述

To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hide with sunscreen when they‘re at the beach. Cow i has a minimum and maximum SPF rating (1 ≤ minSPFi ≤ 1,000; minSPFi ≤ maxSPFi ≤ 1,000) that will work. If the SPF rating is too low, the cow suffers sunburn; if the SPF rating is too high, the cow doesn‘t tan at all........

The cows have a picnic basket with L (1 ≤ L ≤ 2500) bottles of sunscreen lotion, each bottle i with an SPF rating SPFi (1 ≤ SPFi ≤ 1,000). Lotion bottle i can cover coveri cows with lotion. A cow may lotion from only one bottle.

What is the maximum number of cows that can protect themselves while tanning given the available lotions?

有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值,太大就晒伤了,太小奶牛没感觉。

而刚开始的阳光的强度非常大,奶牛都承受不住,然后奶牛就得涂抹防晒霜,防晒霜的作用是让阳光照在身上的阳光强度固定为某个值。

那么为了不让奶牛烫伤,又不会没有效果。

给出了L种防晒霜。每种的数量和固定的阳光强度也给出来了

每个奶牛只能抹一瓶防晒霜,最后问能够享受晒太阳的奶牛有几个。

输入输出格式

输入格式:

* Line 1: Two space-separated integers: C and L

* Lines 2..C+1: Line i describes cow i‘s lotion requires with two integers: minSPFi and maxSPFi

* Lines C+2..C+L+1: Line i+C+1 describes a sunscreen lotion bottle i with space-separated integers: SPFi and coveri

输出格式:

A single line with an integer that is the maximum number of cows that can be protected while tanning

输入输出样例

输入样例#1:
复制

3 2
3 10
2 5
1 5
6 2
4 1

输出样例#1: 复制

2

分析

中文翻译有点误导,自己看清楚了,防晒霜是先读防晒指数,再读防晒霜的个数。奶牛按上限排序,而防晒霜直接按防晒值排序就可以了。

我对于这种排序方式的理解是:我们使得防晒值与奶牛上限越接近,意味着后面的防晒霜越难来满足这只奶牛,也就是这瓶防晒霜来满足这只奶牛是更优的。一瓶防晒霜最多只能满足一只奶牛,所以如果能满足,那么就用这瓶防晒霜。这就是这道题一个贪心的想法。

程序

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXC = 2500 + 1;
 4 struct node
 5 {
 6     int Mn, Mx;
 7 }cows[MAXC];
 8 struct sunscreen
 9 {
10     int amt, cov;
11 }ss[MAXC];
12 bool comp1(node x, node y)
13 {
14     return x.Mx < y.Mx;
15 }
16 bool comp2(sunscreen x, sunscreen y)
17 {
18     return x.cov < y.cov;
19 }
20 int main()
21 {
22     int c,l,ans;
23     cin >> c >> l;
24     for (int i = 1; i <= c; i++)
25         cin >> cows[i].Mn >> cows[i].Mx;
26     for (int i = 1; i <= l; i++)
27         cin >> ss[i].cov >> ss[i].amt;
28     sort(cows+1, cows+(c+1),comp1);
29     sort(ss+1, ss+(l+1), comp2);
30     for (int i = 1; i <= c; i++)
31     {
32         for (int j = 1; j <= l; j++)
33             if(ss[j].cov >= cows[i].Mn && ss[j].cov <= cows[i].Mx && ss[j].amt)
34             {
35                 ss[j].amt--;
36                 ans++;
37                 break;
38             }
39     }
40     cout << ans << endl;
41     return 0;
42 }

原文地址:https://www.cnblogs.com/OIerPrime/p/8504387.html

时间: 2024-11-09 02:09:04

USACO 2007 NOV Sunscreen的相关文章

【POJ3614】【USACO 2007 Nov Gold】 3.Sunscreen 贪心

题意: 有若干个区间,若干种数,每个数告诉你有多少个. 然后一个数可以被放到一个x∈该区间 的区间,问最多有多少个区间可以被放. 题解: 显然我们可以用二分图最大匹配做,水题. 但是此题有别的技巧. 就是我们可以贪心进行处理. 首先我们考虑到需要将两种数都排个序. 然后再进行贪心. 一种错误的贪心法是单调队列式贪心,就是记录个top,然后单调往后推. 这个不仔细想还不知道它是错的. 额,至于卡它的数据,,我可以提供给你一个错误代码和一个拍子,你们可以自己拍一组数据出来,很高效. 这里贴一份错误代

【BZOJ】【1046】/【POJ】【3613】【USACO 2007 Nov】Cow Relays 奶牛接力跑

倍增+Floyd 题解:http://www.cnblogs.com/lmnx/archive/2012/05/03/2481217.html 神题啊= =Floyd真是博大精深…… 题目大意为求S到E,恰好经过N条边的最短路径(姑且称为路径吧,虽然好像已经不是了……) 总共只有大约200个点(很多点根本没走到,离散化一下即可)所以可以考虑Floyd算最短路. 引用下题解: 题目求i,j之间边数恰为N的最短路径(边可以重复走),我们知道线性代数中有:01邻接矩阵A的K次方C=A^K,C[i][j

【POJ3612】【USACO 2007 Nov Gold 】1.Telephone Wire 动规

题意: 给出若干棵树的高度,你可以进行一种操作:把某棵树增高h,花费为h*h. 操作完成后连线,两棵树间花费为高度差*定值c. 求两种花费加和最小值. 题解: 跟NOIP2014 D1T3很像. 暴力动规是O(1*10^9)会T 所以单调队列一下,每颗树扫两遍结束. 完事,看水代码吧. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N

奶牛接力 (Cow Relays, USACO 2007 Nov)

题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout the pasture. Each trail connects two different intersections (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000), each

BZOJ 1706 usaco 2007 Nov relays 奶牛接力跑/POJ 3613 Cow Relays 倍增Floyd

题目大意:求恰好走k步从S到T的最短路. 思路:设f[p][i][j]为从i到j恰好走2^p步的最短路,DP方程十分简单:f[p][i][j] = min(f[p][i][j],f[p - 1][i][k] + f[p - 1][k][j]); 对总步数T进行二进制拆分,在T有1的位置上,假如这个位置为p,那么就用f[p][][]来更新答案g[][],最后得到的g[][]就是答案矩阵. 注意要离散化一下.. CODE: #include <cstdio> #include <cstrin

【POJ3613】【USACO 2007 Nov Gold】 2.Cow Relays 矩阵乘法?

题意:给你一个m条边的图,求s到t的正好用k条边的最短路. (输入k,t,s,t) 题解: 先说说暴力. 动规f[k][i][j]表示i到j经过k条边的最短路,然后外层循环k一遍遍跑最后出解. 显然大概率T. 然后有一种思路: 我们可以动规求得f[k][i][j]表示i到j经过k条边的最短路,然后再求g[i]表示从终点走i步回到终点的最短路. 这样我们就可以乱搞过了.(没写,也没细想) 再之后是正解: 我们可以利用类似于快速幂的方法求f[i][j]表示i到j正好用多少多少步. 然后思想是使用边数

【POJ3612】【USACO 2007 Nov Gold】 1.Telephone Wire 动态调节

意甲冠军: 一些树高给出.行一种操作:把某棵树增高h,花费为h*h. 操作完毕后连线,两棵树间花费为高度差*定值c. 求两种花费加和最小值. 题解: 跟NOIP2014 D1T3非常像. 暴力动规是O(1*10^9)会T 所以单调队列一下,每颗树扫两遍结束. 完事,看水代码吧. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 101

BZOJ 1641 USACO 2007 Nov. Cow Hurdles 奶牛跨栏

[题解] 弗洛伊德.更新距离的时候把$f[i][j]=min(f[i][j],f[i][k]+f[k][j])$改为$f[i][j]=min(f[i][j],max(f[i][k],f[k][j]))$. #include<cstdio> #include<algorithm> #include<cstring> #define N (400) #define rg register using namespace std; int n,m,t,a[N][N]; inl

USACO 2013 Nov Silver Pogo-Cow

最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? ? Pogo-Cow Description (大意是一条直线上有一些带权值的点,可以选择一个点作为出发点,选好一个前进方向(左或右)然后不断地向前跳到另一个点,得分为这个点的权值,要求每一跳的跳跃距离不小于前一跳,求能获得的最大得分) In an ill-conceived attempt to enhance the mob