问题标题: 酷町堂:1260 RW 求找错

0
0
已解决
曹博扬
曹博扬
初级天翼
初级天翼
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,st,m;
struct f{
    int x,y;
}a[10100];
bool cmp(f a,f b){
    if(a.x!=b.x)
        return a.x<b.x;
    return a.y<b.y;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i].x>>a[i].y;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++){
        int c=0;
        st=-1;
        for(int j=i+1;j<=n;j++){
            if(a[j].x>a[i].y){
                c++;
                st=max(a[j].y,st);
            }
        }
        m=max(c,m);
    }
    cout<<m;
    return 0;
}

0分代码

哪错了????????

谁让我满分我就关注他()


0
已采纳
包涵宇
包涵宇
中级天翼
中级天翼

你这思路有问题,我也没法帮你啊~

思路:按结束时间从小到大排序

定义一个变量,记录结束时间

然后循环{

如果这个数的开始时间<记录结束时间的变量{

    计时器++

记录结束时间的变量=这个数结束的时间

}

}

最后输出计数器即可

 

 

 

 

ps:这能叫思路吗?这都是代码了!!!

0
朱小川
朱小川
缔造者
缔造者

你第一个for循环要打大括号

0
陈正朔
陈正朔
初级光能
初级光能

你学过贪心的区间问题吗?(代码有些离谱)

首先是排序规则

注意

尽量先安排结束时间早的区间,举不出反例,我们可以这样考虑它的合理性:先安排结束时间早的区间,则会遗留更多的时间以供安排,这对我们安排尽量多的区间是有利的。

代码应该是

return a.ed<b.ed;

之后是第二个for循环

应该改成

int end=-1;
    for(int i=1;i<=n;i++){
        if(a[i].st>=end){//如果这个区间的开始时间在上一个区间的结束时间之后,则可以选择
            cnt++;
            end=a[i].ed; //结束时间更新 
        }
    } 

我的st就是你的x,我的ed就是你的y

我要回答