区间调度问题。
1,看起来就难里难气的。
2,关键是思想吧,在可选的工作中每次都选择结束时间最早的工作。
3,对了还要再独立写一遍才算。
#include<utility> #include<algorithm> using namespace std; int n,S[1005],T[1005]; pair<int,int> itv[1005]; int ans=0,t=0; int main(){ cin>>n; for(int i=0;i<n;i++) {cin>>S[i];cin>>T[i];} for(int i=0;i<n;i++) {itv[i].first=T[i];itv[i].second=S[i];} sort(itv,itv+n); //不过这个排序应该是以first为首,second跟着变 //所以就把结束时间早的给排到前面去了 for(int i=0;i<n;i++) { if(t<itv[i].second)//因为结束时间早的已经排到前面去了。 { ans++; t=itv[i].first; } }//设计的还是很巧妙的 cout<<ans<<endl; }
4,记住是独立得写出来。
5,还有费曼一方面从宏观上费曼整个题目,一方面从微观的角度费曼一些代码细节。
6,经过我这里的经验,发现三遍也不一定好。
分三个阶段
第一,借助各种方法实现了一遍(标志是起码已经通过样例了(或者AC))
第二,开始单纯写代码,表示是能够独立写一遍之后,开始用脑子过一遍整个题目,然后再写最后一遍。
第三,开始费曼,一方面费曼大的题目题意,一方面费曼小的代码细节。
7,费大。简化为一个简陋版的拼凑问题,因为一般的拼凑是恰好,这个不要求恰好,但是拼凑的时候你可以不足,但是不可以超过。
(也可以想象成不足可以用胶水什么的粘上,但是为了尽量少用胶水,所以要尽量多的木板)
然后我们的解决方法就是每次在可选择的中的木板中选
//不行,你这样拼凑的话失去了人家固有的两个属性。
若干个具有两个可以比较的属性的事务,重点比较最后一个属性。在选择中添加了个贪心嘛(以最后一个属性为决定因素)。
那怎么来深化代码细节?
一,明确该模块代码的变量以及各表达式的意义。
二,对该模块进行改写。
#include<iostream> #include<utility> #include<algorithm> using namespace std; const int maxn=1005; int n,S[maxn],T[maxn]; pair<int,int> itv[maxn]; int ans=0,t=0; int main(){ cin>>n; for(int i=0;i<n;i++){cin>>S[i]>>T[i];} for(int i=0;i<n;i++){itv[i].first=T[i];itv[i].second=S[i];} sort(itv,itv+n); for(int i=0;i<n;i++) { if(t<itv[i].second) { t=itv[i].first; ans++; } } cout<<ans<<endl; }
7,改写后的。
t=itv[0].first; ans=1; for(int i=1;i<n;i++) { if(t<itv[i].second) { t=itv[i].first; ans++; }