D - Three Integers
Posted pangbi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D - Three Integers相关的知识,希望对你有一定的参考价值。
https://codeforces.com/contest/1311/problem/D
本题题意:给出a,b,c三个数,a<=b<=c;
可以对三个数中任意一个进行+1或-1的操作;
问题:求出最少操作数使这些数满足:b整除a,c整除b
思路:题目中给出abc的范围只有1e4
所以我们可以通过枚举的方式来找出答案;
我们通过枚举b的大小,然后计算在b为k值得情况下,a,c为哪个数最优
暴力枚举出最优情况即可;
细节:在枚举b为k时,对于a,我们可以通过预处理出b的因子,然后枚举因子与原本的数的差值,找出最优即可;
而对于c,有以下情况:
1.对于b>c的情况,我们只需要让c等于b
2.对于c>b的情况,我们有两种可能,1.c已经整除b,这种需要的操作数为0
2.c没整除b,所以可能让c减少到为b的倍数,或者增大到b的倍数,两者枚举找操作数小的即可;
所以这道题的做法就是:先预处理出范围内的因子,然后枚举;
代码如下:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define me(a,x) memset(a,x,sizeof a) 5 #define rep(i,x,n) for(int i=x;i<n;i++) 6 #define repd(i,x,n) for(int i=x;i<=n;i++) 7 #define all(x) (x).begin(), (x).end() 8 #define pb(a) push_back(a) 9 #define paii pair<int,int> 10 #define pali pair<ll,int> 11 #define pail pair<int,ll> 12 #define pall pair<ll,ll> 13 #define fi first 14 #define se second 15 vector<int>g[20005]; 16 int a,b,c; 17 void inist() 18 { 19 for(int i=1;i<=20000;i++){ 20 for(int j=1;j<=20000/i;j++) 21 g[i*j].pb(i); 22 } 23 24 } 25 int work(int& aa,int bb,int& cc) 26 { 27 int ans=0; 28 int minn=1000000; 29 int l=g[bb].size(); 30 int x=aa; 31 for(int i=0;i<l;i++){ 32 if(minn>abs(g[bb][i]-aa)){ 33 minn=abs(g[bb][i]-aa); 34 x=g[bb][i]; 35 } 36 } 37 aa=x; 38 ans+=minn; 39 if(bb>cc){ 40 ans+=abs(bb-cc); 41 cc=bb; 42 } 43 if(cc%bb<bb-cc%bb){ 44 ans+=cc%bb; 45 cc-=cc%bb; 46 } 47 else{ 48 ans+=bb-cc%bb; 49 cc+=bb-cc%bb; 50 } 51 return ans; 52 } 53 int main() 54 { 55 inist(); 56 int t; 57 cin>>t; 58 while(t--){ 59 int ans=100000; 60 int ansa,ansb,ansc; 61 cin>>a>>b>>c; 62 for(int i=1;i<=20000;i++){ 63 int a1=a,b1=i,c1=c; 64 int temp=abs(i-b); 65 temp+=work(a1,b1,c1); 66 if(temp<ans){ 67 ans=temp; 68 ansa=a1;ansb=b1;ansc=c1; 69 } 70 } 71 cout<<ans<<endl; 72 cout<<ansa<<" "<<ansb<<" "<<ansc<<endl; 73 } 74 return 0; 75 }
以上是关于D - Three Integers的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 1131D(Three Integers)