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)

Three Integers

Codeforces Round #624 (Div. 3) D. Three Integers

D. Three Integers(暴力)

Three.js 中的自定义纹理着色器

THREE.js - 大型int作为Uniform