Codeforces Round #485 (Div. 2)

本文探讨了三道编程题目,包括使用无限宝石颜色映射的简单查询问题、高中数学归纳法的应用以及寻找三个递增字体大小的广告牌组合。通过对无限宝石颜色属性的映射实现快速查询,利用高中数学归纳法解决指数比较问题,并采用n²算法找到最优成本的广告牌组合。

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

A.Infinity Gauntlet

六颗无限宝石,颜色和宝石属性用map维护然后标记查询即可,水题。

代码:

#include<bits/stdc++.h>
using namespace std;
#define ins insert
map<string,string> inf;
map<string,bool> rec;
int main()
{
    inf["green"]="Time";
    inf["purple"]="Power";
    inf["orange"]="Soul";
    inf["red"]="Reality";
    inf["yellow"]="Mind";
    inf["blue"]="Space";

    rec["green"]=0;
    rec["purple"]=0;
    rec["orange"]=0;
    rec["red"]=0;
    rec["yellow"]=0;
    rec["blue"]=0;

    int n;
    cin>>n;
    cout<<6-n<<endl;
    while(n--)
    {
        string h;
        cin>>h;
        rec[h]=1;
    }
    for(auto p=rec.begin();p!=rec.end();p++)
    {
        if(p->second!=true)
        {
            cout<<inf[p->first]<<endl;
        }
    }
    return 0;
}

B.High School: Become Human

这一题是给定两个正整数xxy,判断xyxyyxyx的大小关系。
记得在高中做过一个数学归纳法的题目就是推导当y>x>2y>x>2xxy均为整数,就有xy>yxxy>yx恒成立。那么这一题反过来用这个结论就可以知道,x=yx=y时,两者相等,当min(x,y)>2min(x,y)>2时,必然满足xy>yxxy>yx。最后,当min(x,y)=2 && max(x,y)=4min(x,y)=2 && max(x,y)=4时,有xy=yxxy=yx,而当min(x,y)=2 && max(x,y)=3min(x,y)=2 && max(x,y)=3min(x,y)=1min(x,y)=1时,有xy<yxxy<yx

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    cin>>a>>b;
    if(a==b||(a==2&&b==4)||(a==4&&b==2)) cout<<"=";
    else if((a==2&&b==3)) cout<<"<";
    else if((a==3&&b==2)) cout<<">";
    else if(a==1||b==1)
    {
        if(a==1) cout<<"<";
        else cout<<">";
    }
    else
    {
        if(a<b) cout<<">";
        else cout<<"<";
    }
    return 0;
}

C.Three Displays

题意,依次给出Display的字体大小与价格,找出三个字体大小的递增序列,然后输出这个序列cost总和的最小值,若不存在这个序列就输出-1。数量n的范围:0<n<=30000<n<=3000

分析:
既然nn是小于等于3000,那么可以考虑n2算法。首先可以暴力枚举前两个广告牌,然后:若这两个广告牌的大小满足递增条件,则通过枚举第二个广告牌后面的广告牌也能在同样的n2n2时间内求出第三个满足递增且最便宜的广告牌(当然这里我们可以预处理出前n1n−1个广告牌的后面的满足递增的最小cost的index记录数组)。这样n2n2的时间内的枚举就能求解。时间复杂度:O(n2)O(n2)

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int font[3002];
    int cost[3002];
    int af[3002];
    for(int i=0;i<n;i++)
    {
        cin>>font[i];
    }
    for(int i=0;i<n;i++)
    {
        cin>>cost[i];
    }
    for(int i=0;i<n-1;i++)
    {
        int lw=100000001;
        int idx=-1;
        for(int j=i+1;j<n;j++)
        {
            if(font[j]>font[i]&&cost[j]<lw)
            {
                idx=j;
                lw=cost[j];
            }
        }
        af[i]=idx;
    }

    int mincost=2000000000;
    for(int i=0;i<n-2;i++)
    {
        for(int j=i+1;j<n-1;j++)
        {
            if(font[i]<font[j])
            {
                int sum=cost[i]+cost[j];
                if(af[j]!=-1)
                {
                    sum+=cost[af[j]];
                    if(sum<mincost) mincost=sum;
                }
            }
        }
    }
    if(mincost!=2000000000)
    cout<<mincost;
    else cout<<-1;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值