AtCoder Beginner Contest 330

B - Minimize Abs 1

思维题

题意:给定一个范围,你选择一个数,使得image

思路:如果A[i]在l,r中间,那么直接打印就行,如果不是就打印就近的

using namespace std;
void solve(){
	int n,l,r;
	cin>>n>>l>>r;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		if(x<l){
			cout<<l<<" ";
		}else if(x>r){
			cout<<r<<" ";
		}else{
			cout<<x<<" ";
		}
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	//cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 

C - Minimize Abs 2

题意是:给定一个n,找出两个非负数,使得:

image

思路:枚举x的值,最小是0,最大是2e6,然后y会有两个值,分别是image

取最小的即可

#define int long long
using namespace std;
void solve(){
	int n;
	cin>>n;
	int ans=2e12;
	for(int i=0;i<=2e6;i++){
	  int x=i*i;
	  int y=abs(n-x);
	  int a=floor(sqrt(y));
	  int b=ceil(sqrt(y));
	  ans=min(ans,min(abs(x+a*a-n),abs(x+b*b-n)));
    }
	cout<<ans;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t=1;
	//cin>>t;
	for(int i=1;i<=t;i++)solve();
	return 0;
} 
posted @ 2023-11-27 14:58  yufan1102  阅读(44)  评论(0)    收藏  举报