[codeforces 1311D] Three Integers 枚举所有可能+用约束降时间复杂度+一步分作两步走降时间复杂度

Codeforces Round #624 (Div. 3)   比赛人数6075

[codeforces 1311D] Three Integers  枚举所有可能+用约束降时间复杂度+一步分作两步走降时间复杂度

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1311/problem/C

ProblemLangVerdictTimeMemory
D - Three Integers GNU C++11Accepted77 ms0 KB

//枚举所有可能+用约束降时间复杂度+一步分作两步走降时间复杂度
//O(t*n*logn)
//因为可加可减,具体到某个数,最小可能是1,最大可能是20000
//INF=(2*10^4)*3=6*10^4  INF=100000即可
//看他人代码,应看比赛时较早敲出且效率高的代码,而不是,只看效率高的代码。
//要知道,很多效率高的代码都不是比赛中敲出的代码,这样的代码,写教科书可以,实战还斟酌。

#include <stdio.h>
#define INF 100000
int a[20010],ab[20010],b,c;
int abs(int a){//绝对值计算
	return a>=0?a:-a;
}
int main(){
	int x,y,z,i,j,t,ans;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&x,&y,&z);
		for(i=1;i<=2*z;i++)ab[i]=INF;
		for(i=1;i<=2*z;i++)//a=i,b=j
			for(j=i;j<=2*z;j+=i)// that B is divisible by A
				if(abs(i-x)+abs(j-y)<ab[j]){//以中间的数为中介
					ab[j]=abs(i-x)+abs(j-y);
					a[j]=i;//b=j时,a=i
				}
		ans=INF;
		for(i=1;i<=2*z;i++)//b=i,c=j
			for(j=i;j<=2*z;j+=i)//C is divisible by B
				if(ab[i]+abs(j-z)<ans){
					ans=ab[i]+abs(j-z);
					b=i,c=j;
				}
		printf("%d\n%d %d %d\n",ans,a[b],b,c);
	}
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值