区间调度问题。

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++;
         } 
posted @ 2019-12-31 13:02  北月真好  阅读(194)  评论(0编辑  收藏  举报