USACO Section1.2 Milking Cows 解题报告
milk2解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
N个农民,每个农民从L[i]到R[i]时间给奶牛挤奶。问最长的一直有人挤奶的时间,和最长的没有人挤奶的时间。
【数据范围】
1<=N<=5000
0<=L[i],R[i]<=1,000,000
【输入样例】
3
300 1000
700 1200
1500 2100
【输出样例】
900 300
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
先对N个农民按照L[i]排序,然后顺序扫。
我用Sum[0]记录最长一直没人挤奶的时间,用Sum[1]记录最长一直有人挤奶的时间。
用Lt记录当前所考虑的开始时间,Rt记录当前所考虑的结束时间。
“a←b”表示用b更新a,即 if(b>a) a=b;
开始 Lt=L[1]; Rt=R[1];
如果 R[i]<L[i+1],说明i和i+1时间分开了,那么 Sum[0]←L[i+1]-Rt; Sum[1]←Rt-Lt;
否则,说明i+1可以和i的挤奶时间连上,那么 Rt←R[i+1];
算法描述完毕,注意别写错就好。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
一遍AC。
复习了下快排~
还有由于直接上手写的代码,代码不漂亮:
1.bool变量p没用上
2.L和R如果定义成Time类型,和T[]保持一致就更好看了
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1 /* 2 ID: icedrea1 3 PROB: milk2 4 LANG: C++ 5 */ 6 7 #include <iostream> 8 #include <fstream> 9 using namespace std; 10 11 int N; 12 struct Time { int b,g; } T[1+5000]; 13 14 void qsort(Time T[],int l,int r) 15 { 16 if(l>=r) return; 17 18 int i=l,j=r,x=T[(l+r)>>1].b; 19 while(true) 20 { 21 while(T[i].b<x) ++i; 22 while(T[j].b>x) --j; 23 if(i>j) break; 24 Time t=T[i]; T[i]=T[j]; T[j]=t; 25 ++i; --j; 26 } 27 qsort(T,l,j); qsort(T,i,r); 28 } 29 30 void change(int &a,int b) 31 { 32 if(b>a) a=b; 33 } 34 35 int main() 36 { 37 ifstream in("milk2.in"); 38 ofstream out("milk2.out"); 39 40 in>>N; 41 for(int i=1;i<=N;++i) in>>T[i].b>>T[i].g; 42 43 qsort(T,1,N); 44 45 bool p; // Ture挤奶,F空闲 46 int L,R; // 当前时间段 47 int Sum[2]={0,0}; // 最大值——0空闲时间,1挤奶时间 48 49 L=T[1].b; R=T[1].g; 50 for(int i=1;i<=N;++i) 51 { 52 if(R<T[i+1].b) // 挤奶时间完结 53 { 54 change(Sum[0],T[i+1].b-R); 55 change(Sum[1],R-L); 56 L=T[i+1].b; R=T[i+1].g; 57 } 58 else // 更新挤奶时间 59 { 60 change(R,T[i+1].g); 61 } 62 } 63 change(Sum[1],R-L); 64 65 out<<Sum[1]<<" "<<Sum[0]<<endl; 66 67 in.close(); 68 out.close(); 69 return 0; 70 }
posted on 2015-03-08 23:25 IceDream61 阅读(260) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端