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
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
D - Three Integers | GNU C++11 | Accepted | 77 ms | 0 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);
}
}