D. Three Integers
Posted zcb123456789
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Three Integers相关的知识,希望对你有一定的参考价值。
题目链接:http://codeforces.com/contest/1311/problem/D
题意:有三个数a,b,c,且a<=b<=c。你每次可以选择一个数加1或减1,但不能变为非正数。要求尽可能少的操作完后,使得b%a=0,c%b=0。输出最少操作数,并输出最后的a,b,c。
思路:枚举第一个数,然后枚举第二个数是第一个数的几倍,前两个数都已经确定了,就可以确定c为多少时,这次操作数最少。时间复杂度为O(n3/2)。主要枚举那个倍数时要多枚举一倍,因为b可能变成超过10000的数时更优。(我就是因为这个被hacked的)。
#include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<string> #include<algorithm> #include<queue> #include<map> typedef long long ll; using namespace std; //priority_queue<pair<int, int> >qu1,qu2,qu3; //pair<int, int> b(1, -2); int main() { int t; scanf("%d",&t); while(t--) { int a,b,c; int u,v,w; scanf("%d%d%d",&a,&b,&c); int ans=99999999; for(int i=1;i<=10000;i++) { int xx=10000/i+1; for(int j=1;j<=xx;j++) { int x=i,y=i*j; int sum=abs(x-a); sum+=abs(y-b); int ww; if(c<=y) { sum=sum+y-c; ww=y; } else { int zz; int yy=c%y; if(yy<=y-yy) { zz=yy; ww=c-yy; } else { zz=y-yy; ww=c-yy+y; } sum+=zz; } if(sum<ans) { ans=sum; u=x; v=y; w=ww; } } } printf("%d ",ans); printf("%d %d %d ",u,v,w); } }
以上是关于D. Three Integers的主要内容,如果未能解决你的问题,请参考以下文章