题意:
解法:
枚举行坐标,计算出上下边界,计算一下两边界之间有多少个整数就行了。
这题恶心就恶心在,精度很容易出现误差,
一种解决方案就是对所有数据乘上10000(因为题目给的数据最多到小数点后四位),
将所有数据变成整数之后再进行计算。
最后就是细节也得认真处理。
code:
#include<bits/stdc++.h>
typedef long long ll;
#define int long long
using namespace std;
const int p=1e4;
int read(){
string s;cin>>s;
int t=4;
int f=0;
int ans=0;
for(auto i:s){
if(i=='.'){
f=1;
continue;
}else{
ans=ans*10+(i-'0');
if(f)t--;
}
}
while(t){
ans=ans*10;
t--;
}
return ans;
}
signed main(){
int X=read();
int Y=read();
int R=read();
//定义横坐标左右边界
int lc=X-R;
int rc=X+R;
while(lc%p)lc++;
while(rc%p)rc--;
//定义上下界指针; 横坐标变化的时候,只需要移动一点点上下界指针就行了.
int up=Y,down=Y;
while(up%p)up++;//取整
while(down%p)down--;
//
int ans=0;
for(int i=lc;i<=rc;i+=p){//枚举横坐标
int ix=abs(X-i);
//
while(ix*ix+(up-Y)*(up-Y)>R*R)up-=p;//up下移
while(up<=Y||ix*ix+(up-Y)*(up-Y)<=R*R)up+=p;//up上移到上界+1
//
while(ix*ix+(Y-down)*(Y-down)>R*R)down+=p;//down上移
while(down>=Y||ix*ix+(Y-down)*(Y-down)<=R*R)down-=p;//down下移到下界-1
//
int add=(up-down+p-2*p)/p;//up-down+1-2就是长度.
if(add>0)ans+=add;
}
cout<<ans<<endl;
return 0;
}