码蹄集部分题目(2024OJ赛19期;贪心集训)

1🐋🐋水温调节(黄金;贪心)

时间限制:1秒

占用内存:128M

🐟题目思路

贪心思路:先将两只水龙头的流速开到最大,温度高了,就把热水的流速降低一个单位,温度低了就把冷水的流速降低一个单位,当任意一个水龙头的流速小于0时结束循环。

【码蹄集进阶塔全题解08】算法基础:贪心 MT2080 – MT2092_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
​
int main( )
{
    double t1,t2,x1,x2,t0;
    double y1,y2,t;
    double tmax=0x3f3f3f3f,ans1,ans2;
    cin>>t1>>t2>>x1>>x2>>t0;
    y1=x1;
    y2=x2;
    while(y1>=0&&y2>=0)
    {
        t=(t1*y1+t2*y2)/(y1+y2);
        if(t>=t0)
        {
            if(t<tmax) 
            {
                tmax=t;
                ans1=y1;
                ans2=y2;
            }
            y2--;
        }
        else y1--;
    }
    cout<<ans1<<" "<<ans2;
    return 0;
}

2🐋🐋斐波那契数列的组合(黄金;贪心)

时间限制:1秒

占用内存:128M

🐟题目思路

  • 贪心思想:要最少数目,那么从大数来取最好。

【码蹄集进阶塔全题解09】算法基础:贪心 MT2093 – MT2105_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int maxm=1e6+50;
​
int minfbncn(int k)
{
    vector<int> f;
    f.push_back(1);
    f.push_back(1);
    while(1)
    {
        if(f[f.size()-1]+f[f.size()-2]>1e9) break;
        f.push_back(f[f.size()-1]+f[f.size()-2]);
    }
    int cnt=0;
    for(int i=f.size()-1;i>=0;i--)
    {
        if(k>=f[i])
        {
            cnt+=k/f[i];
            k=k-k/f[i]*f[i];
        }
        if(k==0) break;
    }
    return cnt;
}
​
int main( )
{
    int n;
    cin>>n;
    cout<<minfbncn(n)<<endl;
    return 0;
}

3🐋🐋数列分段(黄金;贪心)

时间限制:1秒

占用内存:64M

🐟题目思路

贪心思路:每个元素只有两个选择,并到当前段和自成一段。那也就是,每一段都尽可能地接近N即可。

【码蹄集进阶塔全题解09】算法基础:贪心 MT2093 – MT2105_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
int a[200000],n,m,ans;
int main( )
{
    cin>>n>>m;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(sum+a[i]<=m) sum+=a[i];
        else
        {
            sum=a[i];
            ans++;
        }
    }
    cout<<ans+1;
    return 0;
}

4🐋🐋小码哥爱数字(钻石;贪心)

时间限制:1秒

占用内存:128M

🐟题目思路

贪心思路:从左到右遍历这个字符串,只要前面一个数比后面的数要大,那就把前面这个数删掉;如果遍历完了都没有这样的数,就删掉最后一位。

【码蹄集进阶塔全题解09】算法基础:贪心 MT2093 – MT2105_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
string n;
int k,po0;
int main( )
{
    cin>>n>>k;
    int len=n.length();
    while(k--)
    {
        for(int i=0;i<len;i++)
        {
            if(n[i]>n[i+1])
            {
                for(int j=i;j<len;j++) n[j]=n[j+1];
                len--;
                break;
            }
        }
    }
    while(po0<len-1&&n[po0]=='0') po0++;
    for(int i=po0;i<len;i++) cout<<n[i];
    return 0;
}

5🐋🐋甜品供应(钻石;贪心)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解09】算法基础:贪心 MT2093 – MT2105_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=1e5+5;
struct node
{
    int l,r;
    bool operator<(const node &a) const
    {
        if(r==a.r) return l<a.l;
        return r<a.r;
    }
}people[N];
​
struct sweet
{
    int v,num;
    //这里要重载>,因为后边用的是小根堆;如果是大根堆,重载<就行;否则编译不通过
    bool operator>(const sweet &a) const{return v>a.v;}
};
int C,L,cnt[N],ans;
priority_queue<sweet,vector<sweet>,greater<sweet> > q,tmp;
​
int main( )
{
    cin>>C>>L;
    for(int i=1;i<=C;i++) cin>>people[i].l>>people[i].r;
    sort(people+1,people+1+C);
    for(int i=1;i<=L;i++)
    {
        sweet t;
        cin>>t.v>>t.num;
        cnt[t.v]+=t.num;
        q.push(t);
    }
    for(int i=1;i<=C;i++)
    {
        while((!q.empty())&&q.top().v<people[i].l)
        {
            tmp.push(q.top());
            q.pop();
        }
        if(!q.empty()&&q.top().v<=people[i].r)
        {
            ans++;
            cnt[q.top().v]--;
            if(cnt[q.top().v]==0) q.pop();
        }
        while(!tmp.empty())
        {
            q.push(tmp.top());
            tmp.pop();
        }
    }
    cout<<ans;
    return 0;
}

6🐋🐋活动安排(黄金;贪心)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解09】算法基础:贪心 MT2093 – MT2105_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
​
using namespace std;
const int N=5e5+5;
int n,ans;
struct NODE
{
    int l,r;
}node[N];
bool cmp(NODE a,NODE b){return a.r<b.r;}
int main( )
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>node[i].l>>node[i].r;
    sort(node+1,node+1+n,cmp);
    int temp=0;
    for(int i=1;i<=n;i++)
    {
        if(node[i].l>=temp)
        {
            temp=node[i].r;
            ans++;
        }
    }
    cout<<ans;
    return 0;
}

有问题我们随时评论区见~

⭐点赞收藏不迷路~

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值