1 条题解
-
0
自动搬运
来自洛谷,原作者为

七夜
**搬运于
2025-08-24 21:45:15,当前版本为作者最后更新于2019-05-22 15:24:48,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
单纯的贪心,考虑到选择的问题,担心的就是前面的选择会不会对后面选择造成影响,所以我们换个方向考虑一下,也就是利用贪心思想了
我们按照加仑牛奶的价值进行一个排序,优先挤价值大的肯定是没错的,然后就是考虑,用哪一时间去挤得问题,这个其实也很好解决,因为每个时间点只能挤一头奶牛的奶,所以我们按照每个奶牛最后的选取时间往前找,尽量找到靠后面的时间不就可以了嘛
有没有觉得问题一下子豁然开朗了?
那么接下来的问题很简单定义结构体,按照牛奶价值给结构体排序。可能有点人还不是太会,我这里提供一个自己写的昂(dalao别笑):
int cmp(love x,love y) { return x.milk>y.milk; }剩下的就更简单了,循环到每一个奶牛,然后看看能否挤奶,能就加和,不能就跳过。
问题就这么解决了,下面上代码(只提供借鉴,不准复制粘贴):
#include<bits/stdc++.h>//偷懒专用库 #define ll long long #define INF 15200 #define MAXN 99999//宏定义 using namespace std; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; }//这里是快读,可以提供借鉴,忽略掉也无所谓的 struct love { int milk; int time; }you[INF];//定义一个机构体 int cmp(love x,love y) { return x.milk>y.milk; }//结构体排序,按照加仑牛奶的价值从大到小排,先处理价值大的,保证不能挤得越小越好 int n,ans,tot; int a[INF];//判断这个时间点挤没有挤过奶 int main()//主函数部分 { n=read();//读入 for(int i=1;i<=n;++i) { you[i].milk=read(); you[i].time=read(); } //读入加仑牛奶价值和挤得最后时间 sort(you+1,you+1+n,cmp);//排序 for(int i=1;i<=n;++i)//判断是否能挤 { tot=0;//这是一个判断用的东西,待会就明白了 for(int j=you[i].time;j>=1;--j)//从他的最大时间开始,一直到一,看看有没有一个时间点没挤过 { if(a[j]==0)//如果这个点没挤过,就代表当前的牛奶可以被挤 { a[j]=1;//把这个点变成挤过 tot=1;//然后标记成挤过 break;//跳出循环 }//因为此时找到是最晚能挤的时间,所以不会影响以后的选择 } if(tot==1) ans+=you[i].milk;//如果标记过,证明奶挤过,所以答案加上价值 } cout<<ans;//输出 return 0;//养成好习惯,从你我做起 }给蒟蒻一个赞吧,蒟蒻还没有赞呢
- 1
信息
- ID
- 2157
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者