[codevs 1288] 埃及分数 迭代加深搜索

我怎么今天专挑毒瘤题做啊… 一天两道题怕是破纪录了…

这个题还是算一个比较好的模板

当我们枚举一个深度 设当前分数和为 sum s u m 最终结果为 last l a s t

则把 (lastsum)/(1/i) ( l a s t − s u m ) / ( 1 / i ) 作为估价函数, 如果这个值已经大于当前选定分数个数加上最优补数大于枚举深度的话就可以 return r e t u r n 了, 然后这个题是一个很垃圾很垃圾的题, 希望你们不要碰它(手动微笑

如果你硬要写的话注意以下两点
1.这题精度会爆翻, 千万不要用 double d o u b l e ,一定要手写分数啊啊啊啊啊

2.这是一道垃圾卡常题,如果你对自己的常数不自信的话就一定要注意再注意啊.

欢迎挑战垃圾题

90ptsCodes
#include<bits/stdc++.h>
#define For(i, a, b) for(register int i = a; i <= b; ++ i)
#define PII pair<ll, ll>
#define less lunch
#define mp make_pair

using namespace std;
typedef long long ll;

const int maxn = 100 + 10;
int maxd, now[maxn], a, b, flag, ans[maxn];
PII finnal;

bool equal(PII x, PII y) {
    return x.first == y.first && x.second == y.second;
}

bool less(PII x, PII y) {
    bool fux = x.first < 0, fuy = y.first < 0;
    if(fux ^ fuy) return fux;   
    if(fux && fuy) return less(mp(-y.first, y.second), mp(-x.first, x.second));
    return x.first * y.second < y.first * x.second;
}   

PII add(PII x, PII y) {
    ll sonx = x.first, sony = y.first, momx = x.second, momy = y.second;
    ll lcm = momx / __gcd(momx, momy) * momy, sons = (sonx * (lcm / momx)) + (sony * (lcm / momy));
    ll gcd = __gcd(sons, lcm);
    return mp(sons / gcd, lcm / gcd);
}

void judge() {
    for(int i = maxd; i >= 1; -- i) {
        if(now[i] >= ans[i]) return;
        For(j, 1, maxd) ans[j] = now[j];
        return;
    }
}

inline bool dfs(int x, PII sum) {
    if(equal(sum, finnal)) return judge(), true;
    if(x == maxd) return false;
    PII Fuck = add(finnal, mp(-sum.first, sum.second)); 
    int from = max(now[x], int(1.0 * Fuck.second / Fuck.first) - 1);
    int To = Fuck.second * (maxd - x) / Fuck.first;
    for(register int i = from + 1; i <= To; ++ i) {
        PII to = add(sum, mp(1, i));
        if(less(finnal, to)) continue;
        PII ovo = add(sum, mp(maxd - x, i));
        if(less(ovo, finnal)) break;
        now[x + 1] = i;
        if(dfs(x + 1, to)) flag = true;
    }
    return flag;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("1288.in", "r", stdin);
    freopen("1288.out", "w", stdout);
#endif
    memset(ans, 0x3f, sizeof(ans));
    scanf("%d%d", &a, &b);
    ll gcd = __gcd(a, b);
    finnal = mp(a / gcd, b / gcd);
    for(maxd = 0; ; ++ maxd) 
        if(dfs(0, mp(0, 1))) {
            For(i, 1, maxd) 
                printf("%d ", ans[i]);
            break;
        }
    cerr << 1.0 * clock() / CLOCKS_PER_SEC << endl;
    return 0;
}
基于html+python+Apriori 算法、SVD(奇异值分解)的电影推荐算法+源码+项目文档+算法解析+数据集,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 电影推荐算法:Apriori 算法、SVD(奇异值分解)推荐算法 电影、用户可视化 电影、用户管理 数据统计 SVD 推荐 根据电影打分进行推荐 使用 svd 模型计算用户对未评分的电影打分,返回前 n 个打分最高的电影作为推荐结果 n = 30 for now 使用相似电影进行推荐 根据用户最喜欢的前 K 部电影,分别计算这 K 部电影的相似电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now 根据相似用户进行推荐 获取相似用户 K 个,分别取这 K 个用户的最喜爱电影 n 部,返回 K*n 部电影进行推荐 K = 10 and n = 5 for now Redis 使用 Redis 做页面访问次数统计 缓存相似电影 在使用相似电影推荐的方式时,每次请求大概需要 6.6s(需要遍历计算与所有电影的相似度)。 将相似电影存储至 redis 中(仅存储 movie_id,拿到 movie_id 后还是从 mysql 中获取电影详细信息), 时间缩短至:93ms。 十部电影,每部存 top 5 similar movie 登录了 1-6 user并使用了推荐系统,redis 中新增了 50 部电影的 similar movie,也就是说,系统只为 6 为用户计算了共 60 部电影的相似度,其中就有10 部重复电影。 热点电影重复度还是比较高的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值