[数据离散化]codeforces510D fox and jumping

本文详细分析了Codeforces 510D题目,探讨如何利用数据离散化解决最小公约数为零的问题,同时介绍了扩展欧几里得算法的应用。此外,还提到了内联函数、unique函数和lower_bound()函数的使用方法,以及它们在算法中的作用。文章最后简单提及了作者的日常体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Codefoeces510D就是求几个数的最小公约数为零,并在这些最小公约数为零的情况中,

找出money最小的那种情况,输出money

因为li的最大值为10^9,所以最小公约数最大为10^9

显然会爆内存,

所以要用到数据的离散化

这道题用了数据离散化<-新学的东西;

然后还有扩展欧几里得<-上次比赛做到的题

然后学了一点别的

inline函数也就是所谓的内联函数可以用在调用频繁但是短小的函数里面

for example:

inline void toMin(int &a,int b)
{
    if(a>b)
        a=b;
    return;
}

这样可以提高程序效率,同时增加可读性;

unique函数

函数lower_bound()firstlast的前闭后开区间进行二分查找,

返回大于或等于val第一个元素位置。如果所有元素都小于val,则返回last的位置

举例如下:

一个数组number序列为:4,10,11,30,69,70,96,100.设要插入数字3,9,111.pos为要插入的位置的下标

pos = lower_bound( number, number + 8, 3) - numberpos = 0.number数组的下标为0的位置。


所以,要记住:函数lower_bound()firstlast中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!


Erase函数 擦除

http://blog.youkuaiyun.com/zhuimengzh/article/details/6841500

和unique函数配合使用可以去重

for example

 value.erase(std::unique(value.begin(),value.end()),value.end());//对因子进行去重处理

还有gcd函数可以简单的写成

int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b)
}
#include<cstdio>
#include<vector>
#include<algorithm>
    using namespace std;
int num[305];
int price[305];
#define INF 0xfffffff
std::vector<int> value;
std::vector<int> dp;
inline void toMin(int &a,int b)
{
    if(a>b)
        a=b;
    return;
}
int get(int a)
{
    return std::lower_bound(value.begin(),value.end(),a)-value.begin();
}
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
void decompose(int n)
{
    int i;
    for(i=1;i*i<=n;i++){
        if(n%i==0){
            value.push_back(i);
            value.push_back(n/i);//vector中存储了n的因子
        }
    }
    return ;
}
int main()
{
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&num[i]);
        decompose(num[i]);
    }
    for(i=0;i<n;i++){
        scanf("%d",&price[i]);
    }
    std::sort(value.begin(),value.end());
    value.erase(std::unique(value.begin(),value.end()),value.end());//对因子进行去重处理
    dp.resize(value.size(),INF);
    for(i=0;i<n;i++){
        int p=get(num[i]);
        toMin(dp[p],price[i]);
        for(int j=0;j<dp.size();j++){
            if(dp[j]!=INF){
                toMin(dp[get(gcd(value[j],num[i]))],price[i]+dp[j]);
            }
        }
    }
    int ans=dp[0];
    if(ans==INF)
        printf("-1\n");
    else
        printf("%d\n",ans);
    return 0;
}

然后这套题是峰神和进爷教的表示很惶恐qwq

今天上游泳课..所以好累qwq 在泳池 的蓝色的水里世界是不一样的呢..有一种特别的感觉..

恍恍惚惚像是高三的夏天


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值