找点
第一部分:題目
題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=891
描述
上數學課時,老師給了LYH一些閉區間,讓他取盡量少的點,使得每個閉區間內至少有一個點。但是這幾天LYH太忙了,你們幫幫他嗎?
輸入多組測試數據。
每組數據先輸入一個N,表示有N個閉區間(N≤100)。
接下來N行,每行輸入兩個數a,b(0≤a≤b≤100),表示區間的兩個端點。輸出輸出一個整數,表示最少需要找幾個點。樣例輸入41 52 41 42 331 23 45 612 2樣例輸出131 第二部分:思路對區間進行從小到大排序,當左端點一樣時把右端點從小到大排序。排序后從頭開始找到當前第一個有待找點的區間a,把a的左端點置為-1,表示這一次找到的點在a區間上。后續區間b與a能找到公共點的情況:1,左端點一致,那么肯定有公共點。2,a、b的左端點不一致,但b左端點小于等于當前區間a的右端點。這里需要注意:如果b的右端點小于a的右端點時,需要把a的右端點置為b的右端點。并且把b的左端點置為-1. 第三部分:代碼
#include<stdio.h>
int main()
{
int n,s[100][2],i;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&s[i][0],&s[i][1]);
}
int j,t;
for(i=0;i<n-1;i++)//從小到大排序
{
for(j=i+1;j<n;j++)
{
if(s[i][0]>s[j][0]||s[i][0]==s[j][0]&&s[i][1]>s[j][1])//左端點一致時對右端點進行排序
{
t=s[i][0];
s[i][0]=s[j][0];
s[j][0]=t;
t=s[i][1];
s[i][1]=s[j][1];
s[j][1]=t;
}
}
}
int count=0;
for(i=0;i<n;i++)
{
if(s[i][0]!=-1)//左端點為-1,已經找到一個點位于該區間
{
int temp=s[i][1];
s[i][0]=-1;//找到點了
count++;
for(j=i+1;j<n;j++)
{
if(s[j][0]!=-1&&s[j][0]<=temp)
{
s[j][0]=-1;
if(temp>s[j][1])//注意,當后續區間在當前區間內部時,需要縮小范圍
{
temp=s[j][1];
}
}
}
}
}
printf("%d
",count);
}
return 0;
}
總結
- 上一篇: Spring学习使用标签来标记资源(@C
- 下一篇: 初识ASP.NET---一般处理程序