/*
* 程序的版权和版本声明部分:
* Copyright (c) 2014,郑州大学SIAS国际学院
* 作 者: 王 杰
* 完成日期:2014 年 4 月 21 日
*
* 对任务及求解方法的描述部分:
* 输入描述: 略或见注释、总结
* 问题描述: 略或见注释、总结
* 程序输出: 略或见注释、总结
* 问题分析: 略或见注释、总结
* 算法设计: 略或见注释、总结
*/
#include<stdio.h>
typedef struct node{
int b;
int e;
}point;
void insert_sort(point arr[],int length)
{
int i,j;
int key,key1;
for(j=1;j<length;j++){ //每次循环代表要插入的数key,共有n-1个key需要插入(排序)
//1、这两句是每次key插入之前的准备工作
key=arr[j].e;
key1=arr[j].b; //使v,w的参数保持一一对应,w跟着v做相同的操作
i=j-1;
//2、找出key要插入的位置,并把位置腾出来
while(i>=0 && arr[i].e>key){
arr[i+1].e=arr[i].e;
arr[i+1].b=arr[i].b; //使v,w的参数保持一一对应,w跟着v做相同的操作
i--;
}
//3、把key插入到合适的位置上
arr[i+1].e=key;
arr[i+1].b=key1; //使v,w的参数保持一一对应,w跟着v做相同的操作
}
}
int main()
{
point p[10000];
int m,n,i,count,sign;
scanf("%d",&m);
while(m--){
count=0;
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d%d",&p[i].b,&p[i].e);
}
//for(i=0;i<n;i++){
//printf("%d %d\n",p[i].b,p[i].e);
//}
//对p.e从小到大排序
insert_sort(p,n);
//for(i=0;i<n;i++){
//printf("%d %d\n",p[i].b,p[i].e);
//}
//贪心
i=1;
sign=p[i-1].e+1;
while(i<n){
if(p[i].b>=sign){
count++;
sign=p[i].e+1;
}
i++;
}
printf("%d\n",count+1);
}
return 0;
}
运行结果:
总结:
贪心:就像实际生活中的一样,谁先结束 让谁举办,并且实时更新sign;
问题:这道题虽然AC了,但是花费的时间太长了(用的是插排),如图:时间1848 内存 232
下面是用sort快排:
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int b,e;
}node;
bool cmp(struct node a,struct node b)
{
return a.e<b.e;
}
int main()
{
int m,n;
int i;
int count,sign;
struct node time[10010];
cin>>m;
while(m--)
{
cin>>n;
for(i=0;i<n;i++)
cin>>time[i].b>>time[i].e;
sort(time,time+n,cmp);
//for(i=0;i<n;i++)
//printf("%d %d\n",time[i].b,time[i].e);
count=1;
i=1;
sign=time[i-1].e+1;
while(i<n){
if(time[i].b>=sign){
count++;
sign=time[i].e+1;
}
i++;
}
cout<<count<<endl;
}
return 0;
}
时间 216!内存 232, 在时间花费上大大减少。并且还了解到 用sort对结构体排序的一些知识:对结构体变量的某个成员进行排序,其他的成员也相应地随着移动。
时间 56,内存 348
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 10005
int n, bt[M], et[M], r[M];
int comp(const int a, const int b) { return et[a]<et[b]; }
int main ()
{
int t,i;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d %d",&bt[i],&et[i]);
r[i]=i;
}
sort(r,r+n,comp);
int ans=0,c=0;
for(i=0;i<n;i++){
int x=r[i];
if(c<bt[x]){
c=et[x];
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}
用到STL: 时间 124,内存 308
#include<stdio.h>
#include <vector>
#include<algorithm>
#include<math.h>
using namespace std;
struct activ
{
int begin;
int end;
};
bool cmp( activ a,activ b)
{
return a.end<b.end;
}
int main()
{
//freopen("1.txt","r",stdin);
int n,i;
scanf("%d",&n);
while(n--){
int m;
scanf("%d",&m);
vector<activ> vec;
for(i=0;i<m;i++){
activ a;
scanf("%d%d",&a.begin,&a.end);
vec.push_back(a);
}
sort(vec.begin(),vec.end(),cmp);
int count=vec.size();
int k=0;
for(i=1;i<vec.size();i++){
if(vec[i].begin <= vec[k].end)
count--;
else k=i;
}
printf("%d\n",count);
}
return 0;
}