1 月 30 日算法练习-贪心和思维

巧克力

思路:贪心先选价格小的巧克力,如果价格一样选保质期大的。维护天数数组,选了巧克力后从保质期最后一天往前食用。

cpp 复制代码
#include<iostream>
#include<set>
#include<stdbool.h>
using namespace std;

const int N = 1e5+10;
set<int>se;
int x,n;

struct node{
    int val,L,cnt;
    bool operator < (const struct node &b)const{
        if(val == b.val) return L > b.L;
        return val < b.val;
    }
}a[N];

int main( ){
    cin>>x>>n;
    for(int i=1;i<=n;i++)cin>>a[i].val>>a[i].L>>a[i].cnt;
    sort(a+1,a+1+n);
    
    for(int i=1;i<=x;i++)se.insert(i);
    
    int p = 1,res=0;
    while (se.size()&&p<=n) {
        
        while(se.size()&&a[p].cnt&&*se.begin()<a[p].L ){
            res+=a[p].val;
            a[p].cnt--;
            
            auto it = se.upper_bound(a[p].L);
            it--;
            se.erase(it);
            
        }
        
        p++;
    }
    if(se.size())cout<<-1<<'\n';
    cout<<res<<'\n';
    return 0;
}

答疑

思路:贪心每次选 s+a+e 最小的,能保证总体开始答疑时间和最小

cpp 复制代码
#include<iostream>
#include<stdbool.h>
using namespace std;
using ll = long long;
const int N = 1e3+10;

struct node{
    int s,a,e;
    
    bool operator <(const struct node &x) const{
        return s+a+e < x.s + x.a + x.e;
    }
    
}a[N];

int main( ){
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i].s>>a[i].a>>a[i].e;
    sort(a+1,a+1+n);
    ll res = 0;
    for(int i=1;i<=n;i++){
        res+= (n + 1 - i)*(a[i].a+a[i].s) + ( n-i )*(a[i].e);
    }
    cout<<res<<'\n';
    return 0;
}

皮亚诺曲线



思路:思维题,找规律。

  1. 求距离可以分解为块内距离和块外距离。块外距离=(块号-1)*3^(阶数-1)* 3^(阶数-1)
  2. 块内距离通过(坐标/3^(阶数-1))来得到。
  3. 通过递归逐渐到阶数为 1,返回块号-1,块号从 1 开始。
  4. 把块 1 作为标准块,递归过程中
  5. 在不同的阶数中,块号排列顺序是不同的,所以每个阶数需要重新获得,(x,y)的块号
cpp 复制代码
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
using ll = long long;
map<pair<int,int>,int>mp;
ll p[40];
ll cala(ll k,ll x,ll y,map<pair<int,int>,int> mp){
    ll x_ = x/p[k-1],y_ = y/p[k-1];
    if(k==1)return mp[make_pair(x_, y_)]-1;
    map<pair<int,int>,int> mp1;
    ll ans = (mp[make_pair(x_, y_)]-1)*p[k-1]*p[k-1];
    if((x_==0&&y_==1)||(x_==2&&y_==1))
        for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)mp1[make_pair(2-i,j)]=mp[make_pair(i,j)];
    else if((x_==1&&y_==0)||(x_==1&&y_==2))
        for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)mp1[make_pair(i,2-j)]=mp[make_pair(i,j)];
    else if(x_==1&&y_==1)
        for(int i=0;i<=2;i++)for(int j=0;j<=2;j++)mp1[make_pair(2-i,2-j)]=mp[make_pair(i,j)];
    else mp1 = mp;
    return ans += cala(k-1,x_%p[k-1],y_%p[k-1],mp1);
}

int main( ){
    ll k,x1,x2,y1,y2;cin>>k>>x1>>y1>>x2>>y2;
    p[0]=1;
    for(int i=1;i<=39;i++)p[i] = p[i-1]*3;
    mp[make_pair(0,0)]=1;mp[make_pair(0,1)]=2;mp[make_pair(0,2)]=3;
    mp[make_pair(1, 2)]=4;mp[make_pair(1, 1)]=5;mp[make_pair(1, 0)]=6;
    mp[make_pair(2, 0)]=7;mp[make_pair(2, 1)]=8;mp[make_pair(2, 2)]=9;
    ll a =cala(k,x1,y1,mp);
    ll b =cala(k,x2,y2,mp);
    cout<<abs(a-b)<<'\n';
    return 0;
}
相关推荐
我不是QI2 小时前
DES 加密算法:核心组件、加解密流程与安全特性
经验分享·算法·安全·网络安全·密码学
前端小刘哥2 小时前
新版视频直播点播EasyDSS平台,让跨团队沟通高效又顺畅
算法
明月(Alioo)3 小时前
机器学习入门,无监督学习之K-Means聚类算法完全指南:面向Java开发者的Python实现详解
python·算法·机器学习
叶梅树3 小时前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
lingran__3 小时前
算法沉淀第三天(统计二进制中1的个数 两个整数二进制位不同个数)
c++·算法
MicroTech20253 小时前
微算法科技MLGO推出隐私感知联合DNN模型部署和分区优化技术,开启协作边缘推理新时代
科技·算法·dnn
小冯记录编程4 小时前
深入解析C++ for循环原理
开发语言·c++·算法
chenchihwen5 小时前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf
做科研的周师兄7 小时前
【机器学习入门】7.4 随机森林:一文吃透随机森林——从原理到核心特点
人工智能·学习·算法·随机森林·机器学习·支持向量机·数据挖掘
Sunsets_Red7 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#