美丽方格
题目描述
你手里拿着很多字母牌,在一个方格棋盘上下棋,棋盘的中心是坐标(0,0),你把字母牌在棋盘上摆放,你规定一个美丽的方格是指中心也是坐标(0,0),且方格中不存在相同字母的牌,给你一个摆放完的棋盘,问是美丽方格中最多多少张牌?
思路
- 这题第一反应是枚举正方形边长,为了方便,枚举的数是正方形边长一半(假设这个数是k),这样判断一个点是否在正方形内时,就可以写
abs(x)<=k && abs(y)<=k
- 但是枚举会T,我们就可以用二分答案代替枚举,就是正解
AC啦
#include<bits/stdc++.h> #define int long long using namespace std; struct nd{ int x,y; char ch; nd(int _x,int _y,char _ch){ x=_x; y=_y; ch=_ch; } nd(){ x=y=0; ch='\0'; } }; nd a[10000005]; int n; int cnt[26]={}; bool check(int x){ memset(cnt,0,sizeof cnt); for(int i=1;i<=n;i++) if(abs(a[i].x)<=x && abs(a[i].y)<=x){ if(cnt[a[i].ch-'a']) return false; cnt[a[i].ch-'a']++; } return true; } int Find(){ int l=0,r=10000000; int ans=-1; while(l<=r){ int mid=(l+r)/2; if(check(mid)){ l=mid+1; ans=max(ans,mid); }else r=mid-1; } return ans; } signed main(){ cin>>n; for(int i=1;i<=n;i++){ int x,b; char ch; cin>>x>>b; cin>>ch; while(ch==' ') cin>>ch; a[i]=nd(x,b,ch); } int sq=Find(); int cnt=0; for(int i=1;i<=n;i++) if(abs(a[i].x)<=sq && abs(a[i].y)<=sq) cnt++; cout<<cnt; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~