time limit per test 2 seconds
memory limit per test 256 megabytes
题目链接http://codeforces.com/contest/1131/problem/B
说实在的这题做了很久,WA了很多次WA4的2发,WA8的4发。。。思维不够严谨造成了各种漏洞。。。
题目大意:给你n个分数比,最后一个是最终的分数比,让你求中间有多少场平局。
看起来挺简单的,最初就直接:
#include <bits/stdc++.h>
using namespace std;
const int mac=1e4+10;
int a[mac],b[mac];
int main()
{
int n;
scanf ("%d",&n);
for (int i=1; i<=n; i++){
scanf ("%d%d",&a[i],&b[i]);
}
int ans=1;
for (int i=1; i<=n; i++){
ans+=min(a[i]-a[i-1],b[i]-b[i-1]);
}
printf ("%d\n",ans);
return 0;
}
然后就WA4了,对于这份代码,漏洞很多。。。后来就改成区间的判断:
if (c[sta].a>c[sta].b) {
if (c[end].a<=c[end].b) return c[end].a-c[sta].a+1-mak;
else return c[end].b-c[sta].a+1-mak;
}
else {
if (c[end].a<=c[end].b) return c[end].a-c[sta].b+1-mak;
else return c[end].b-c[sta].b+1-mak;
}
其中sta是上一个的值,end就是当前的值。这还不够,对于各种鬼畜的数据,比如重复的我们要删掉:
if (c[sta].a==c[end].a && c[end].b==c[sta].b) return 0;
但如果它的数据全是0的话又得重新判断:
if (c[n].a==0 && c[n].b==0) ans=1;
else ans=0;
如果只是这样话还是WA8的,还有一种情况就是区间无法相互覆盖的情况:
if (c[sta].a>c[end].b) return 0;
if (c[sta].b>c[end].a) return 0;
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
const int mac=1e4+10;
struct node
{
int a,b;
}c[mac];
#define ll long long
int judge(int sta,int end)
{
int mak=0;
if (c[sta].a==c[end].a && c[end].b==c[sta].b) return 0;
if (c[sta].a>c[end].b) return 0;
if (c[sta].b>c[end].a) return 0;
if (c[sta].a==c[sta].b && c[sta].a!=0) mak=1;
if (c[sta].a>c[sta].b){
if (c[end].a<=c[end].b) return c[end].a-c[sta].a+1-mak;
else return c[end].b-c[sta].a+1-mak;
}
else {
if (c[end].a<=c[end].b) return c[end].a-c[sta].b+1-mak;
else return c[end].b-c[sta].b+1-mak;
}
}
int main()
{
int n;
scanf ("%d",&n);
for (int i=1; i<=n; i++){
scanf ("%d%d",&c[i].a,&c[i].b);
}
ll ans;
if (c[n].a==0 && c[n].b==0) ans=1;
else ans=0;
for (int i=1; i<=n; i++){
ans+=judge(i-1,i);
}
printf ("%lld\n",ans);
return 0;
}