Codeforces Round #624 (Div. 3) D. Three Integers(暴力+枚举因子)

Codeforces Round #624 (Div. 3) D. Three Integers(暴力+枚举因子)_第1张图片
题意很简单 给出三个数
要求变成 b可以整除a c可以整除b
求每个 变化后的数与变化前的数 差距绝对值之和最小
这个题好简单。。我憨批了。。卡到最后也没搞出来
赛后突然发现枚举第三个数就很省事,,就直接补了。。
要不然我就div3 过4题 那就是一波大上分啊。。。。

讲讲我的憨批思路
刚开始想的是从1到2e5 枚举第二个数
然后第一个第三个数都向左向右扩展 找出最近的能符合条件的的数
再计算总的距离 求出最小值
问题就出在 枚举第二个数的话 那你扩展时只能+1或-1.。。。所以我直接T了。。
改了半天想优化 越改越乱 最后在手忙脚乱中结束了比赛。。也结束了上分好机会。。。

后来我发现枚举第三个数的话直接储存每个数的因子就可以了。。。
我是憨批。。到手的分丢了
所以写题时一个理智的头脑和清晰的思路特别重要 先想好再写 !!

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define inf 0x3f3f3f3f
#define INF 0x7fffffff
#define eps 1e-5
#define IOS ios::sync_with_stdio(false),cin.tie(NULL)
#define rep(i,a,n) for(int i=1;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=1;i--)
using namespace std;
const int mod=1e9+7;
const int N=1e5+5;
 
vectorv[N];
void init()
{
    for(int i=1;i<=20050;i++)
    {
        int len=floor(sqrt(i)+0.5);
        for(int j=1;j<=len;j++)
            if(i%j==0)
            {
                v[i].push_back(j);
                v[i].push_back(i/j);
            }
        sort(v[i].begin(),v[i].end());
    }
}
void solve()
{
    int a,b,c;
    cin>>a>>b>>c;
    int fa,fb,fc;
    int cnt=0x3f3f3f3f;
    fa=a,fb=b,fc=c;
    for(int i=1;i<=c*2;i++)
    {
        int disc=abs(i-c);
        int len=v[i].size();
        for(int j=0;jdisa+disb+disc)
                {
                    cnt=disa+disb+disc;
                    fa=v[v[i][j]][k];
                    fb=v[i][j];
                    fc=i;
                }
            }
        }
    }
    cout<>t;
    while(t--)
    {
        solve();
    }
    return 0;
}

你可能感兴趣的:(codeforce,笔记)