III USP Freshmen Contest C. MaratonIME eats japanese food

本篇博客详细解读了Codeforces上的C. MaratonIME eats japanese food问题。内容包括问题描述、解题思路和代码实现。题目中,操作A将盘子放到桌面,操作R从桌面移除盘子。解决策略涉及到对盘子位置的判断,如坐标是否合法、盘子是否已放置、是否有重叠等。同时,对于R操作,需要判断盘子是否存在且半径正确。通过结构体存储每个盘子信息并进行特殊条件判断,可以成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源:http://codeforces.com/gym/101375/problem/C

题解:A就把盘子放到桌面上,R就把盘子从桌面上拿走,A输出No的可能性有3种:1.盘子之前放过了,vis数组标记,1为在桌上了,0为不在。2.盘子的坐标x<0||y<0||x>1000||y>1000,即在桌子外面,3.该盘子与其他盘子重叠了,即这句话

(an[j].r+an[i].r)*(an[j].r+an[i].r)>(an[j].x-an[i].x)*(an[j].x-an[i].x)+(an[j].y-an[i].y)*(an[j].y-an[i].y)

R输出No的可能性有2种:1.盘子不在桌上,即该坐标的vis为0 。  2.该盘子在桌子上,但是半径不符合真实大小。用rr来记录放在这一点坐标的盘子的半径

用结构体存每个点,注意特殊情况的判断即可ac

代码实现:

#include <iostream>
#include <cstring>
#include <algorithm>
#define N 5005
using namespace std;
int vis[1005][1005];
int rr[1005][1005];
struct 
{
	char c;
	int x;
	int y;
	int r;
}an[N];
int main()
{
	memset(vis,0,sizeof(vis));
	memset(rr,0,sizeof(rr));
	int t,j;
	cin>>t;
	for(int i=1;i<=t;++i)
	{
		cin>>an[i].c>>an[i].x>>an[i].y>>an[i].r;
		if(an[i].x<0||an[i].y<0||an[i].x>1000||an[i].y>1000)
		{
			cout<<"No"<<endl;
			continue;
		}
		if(an[i].c=='R')
		{
			if(vis[an[i].x][an[i].y]!=0&&rr[an[i].x][an[i].y]==an[i].r)
			{
				cout<<"Ok"<<endl;
				vis[an[i].x][an[i].y]=0;
			}
			else
				cout<<"No"<<endl;
		}
		else if(an[i].c=='A')
		{
			if(vis[an[i].x][an[i].y]!=0)
				cout<<"No"<<endl;
			else
			{
				for(j=1;j<=i-1;++j)
				{
					if(an[j].c=='A'&&vis[an[j].x][an[j].y]!=0&&rr[an[j].x][an[j].y]==an[j].r)
					{
						if((an[j].r+an[i].r)*(an[j].r+an[i].r)>(an[j].x-an[i].x)*(an[j].x-an[i].x)+(an[j].y-an[i].y)*(an[j].y-an[i].y))
						{
							cout<<"No"<<endl;
							break;
						}	
					}
				}
				if(j==i)
				{
					cout<<"Ok"<<endl; 
					vis[an[i].x][an[i].y]=1;
					rr[an[i].x][an[i].y]=an[i].r;
				}
			}
		}
	}
	return 0;
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值