要求:
http://codeup.cn/problem.php?cid=100000575&pid=0
说明:
第一次写的代码一直在考虑边界,太复杂了,虽然也写出来了,通过了样例,但一直显示答案错误。。。后来百度发现可以换一种思路去思考,抽象成统计0的个数就好了,,,豁然开朗……
第一次的代码:(在codeup上显示答案错误,给了50分……真的绞尽脑汁去想边界的问题了……)
#include <stdio.h>
#include <math.h>
const int maxn = 10010;
int remain[maxn] = {0};
struct record{
int a;
int b;
} records[maxn];
int main(){
int n,m;
int signal = 0;
while(scanf("%d %d", &n,&m) != EOF, n ||m){
for(int i = 0;i <m;i++){
scanf("%d %d",&(records[i].a),&(records[i].b));
if( i == 0){
remain[signal] = n + 1 - (records[i].b - records[i].a + 1);
n = remain[signal];
//printf("一次计算是%d\n",remain[signal]);
}
else if(records[i].a == records[i].b){
remain[signal] = n -1;
n = remain[signal];
}
else if(records[i].a >= records[i -1].b || records[i].b <= records[i -1].a && records[i].a != records[i].b){
remain[signal] = n - (records[i].b - records[i].a + 1);
n = remain[signal];
//printf("二次计算是%d\n",remain[signal]);
}
else if(records[i].a <= records[i -1].b && records[i].a >= records[i -1].a && records[i].b >= records[i -1].b && records[i].a != records[i].b){
remain[signal] = n - (records[i].b - records[i -1].b);
n = remain[signal];
//printf("三次计算是%d\n",remain[signal]);
}
else if(records[i].a <= records[i -1].a && records[i].b <= records[i -1].b && records[i].b >= records[i - 1].a && records[i].a != records[i].b){
remain[signal] = n - (records[i - 1].a - records[i].a);
n = remain[signal];
//printf("四次计算是%d\n",remain[signal]);
}
else{
remain[signal] = n+0;
n = remain[signal];
}
}
signal++;
}
for(int i = 0;i <signal;i++){
printf("%d\n",remain[i]);
}
}
参考大神的代码:
#include <stdio.h>
#define max 10001
const int maxn = 10010;
int remain[maxn] = {0};
int main()
{
int L=0,M=0;
int left=0,right=0;
int i=0;
int signal = 0;
while(scanf("%d %d",&L,&M)!=EOF, L||M){
int a[max]={0};
//数组必须要定义在主循环内,否则可能会有值被改变
//每一次都要重新修改a[]数组为0
while(M--){
scanf("%d %d",&left,&right);
for(i=left;i<=right;i++){
a[i]=1;
}
}
int cnt=0;
for(i=0;i<=L;i++){//此处i可以取到L
if(!a[i]) cnt++;
}
remain[signal] = cnt;
signal++;
}
for(int i = 0;i <signal;i++){
printf("%d\n",remain[i]);
}
return 0;
}