B. Draw!--简单思维题--Codeforces Round #541 (Div. 2)

Draw!

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值