WA 10分求调

李永林的梦

题目描述

“多么希望醒来,回到了曾经读书的时光,现在经历的一切都是一场梦,我告诉同桌,说做了一个好长好长的梦,同桌骂我白痴,叫我好好听课。你看着窗外的场景,一切是那么熟悉,一切还是原来的样子……”李永林通过时空监测点听到40年前小张老师对这样说。
话说李永林等人将历史时间线划分了n个区域,我们可以将之看成是数轴上的n个闭区间[ai,bi]。现在设尽量少的监测点,使得每个区间都至少有一个点(不同区间内的点可以是同一个),问需要多少个监测点?

输入格式

第一行两个整数 N,表示有N个闭区间,随后N行,每行两个整数,表示区间左端和右端

输出格式

输出选择的点的最小数量

样例

Input 1

3 1 5 2 8 6 9

Output 1

2

样例解释

对于样例1,我们可以选择点3和点6,这样每个区间都至少有一个点,因此选择的点的最小数量为2。

数据范围

1<=N,a,b<=1000

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<int,int>a,pair<int,int>b){
	return a.second<b.second;
}int main(){
  int n,l,r,ans=1,last;
  pair<int,int>p[1001];
  cin>>n;
  for(int i=0;i<n;i++)cin>>p[i].first>>p[i].second;
  sort(p,p+n);
  last=p[0].second;
  for(int i=1;i<n;i++){
	if(last<p[i].first){
      ans++;
      last=p[i].second;
	}
  }cout<<ans;
  return 0;
}

需要更新上个区间的结束位置

改之后是这样:

#include<bits/stdc++.h>
using namespace std;
bool cmp(pair<long long,long long>a,pair<long long,long long>b){
  if(a.first==b.first)return a.second>b.second;
  return a.first<b.first;
}int main(){
  long long n,ans=1,last,l,r;
  vector<pair<long long,long long> >a;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>l>>r;
    a.push_back({l,r});
  }sort(a.begin(),a.end(),cmp);
  last=a[0].second;
  for(int i=1;i<n;i++){
    if(a[i].first>last){
      last=a[i].second;
      ans++;
    }
  }cout<<ans;
  return 0;
}

还是10分

这题名字叫什么

你这个我怎么感觉你是讯飞星火写的

还有你开这么多long long一个#define int long long就可以了

这是我自己写的,我又不是AI

名字叫什么

李永林的梦

我以后是不是要先把题目链接发出来

差不多

你把那个分发糖果给个解决方案呗

整理了一下代码:

#include<bits/stdc++.h>
#define ll long long
#define f first
#define s second
using namespace std;
bool cmp(pair<ll,ll>a,pair<ll,ll>b){
  if(a.f==b.f)return a.s>b.s;
  return a.f<b.f;
}int main(){
  ll n,ans=1,last;
  pair<ll,ll>a[1001];
  cin>>n;
  for(int i=0;i<n;i++)cin>>a[i].f>>a[i].s;
  sort(a,a+n,cmp);
  last=a[0].s;
  for(int i=1;i<n;i++){
    if(a[i].f>last){
      last=a[i].s;
      ans++;
    }
  }cout<<ans;
  return 0;
}

按右边界排,右边界小的在前,因为判断2区间是否相交,是比较前一个的右边界和此时的左边界。