每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Educational Codeforces Round 122 (Rated for Div. 2),C,D

Educational Codeforces Round 122 (Rated for Div. 2),C,D

C

C

这道题就是普通的暴力,但是我在做的过程中第10组数据出现了数据溢出的错误

我的错误代码,我在vp的时候没觉得有什么问题

#include <iostream>
using namespace std;
#define int long long 
int t,k,w,a,hc,dc,hm,dm;
void solve()
{
    cin>>hc>>dc>>hm>>dm;
    cin>>k>>w>>a;
    bool yes=false;
    for (int i=0;i<=k;i++)
    {
        int h=hc+i*a;
        int d=dc+(k-i)*w;
        int cnt=(h+dm-1)/dm;
        if (cnt*d>=hm)
        {
            yes=true;
            break;
        }
    }
    if (yes)
    {
        cout<<"YES\n";
    }
    else 
    {
        cout<<"NO\n";
    }
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

后来看的正确的代码,他换了一种表达方式,可能也有不同之处吧

正确代码

#include <iostream>
using namespace std;
#define int long long 
int t,k,w,a,hc,dc,hm,dm;
void solve()
{
    cin>>hc>>dc>>hm>>dm;
    cin>>k>>w>>a;
    bool yes=false;
    for (int i=0;i<=k;i++)
    {
        int h=hc+i*a;
        int d=dc+(k-i)*w;
        int cnt=(h+dm-1)/dm;
        int cnt2=(hm+d-1)/d;
        if (cnt>=cnt2)
        {
            yes=true;
            break;
        }
    }
    if (yes)
    {
        cout<<"YES\n";
    }
    else 
    {
        cout<<"NO\n";
    }
    return ;
}
signed main ()
{
    cin>>t;
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}

D

D

这一个题目大意就是有一个长度为n的数组,一开始全是1,我们需要把数组每一位变成题目里面给出的b[i],如果成功了,我们就可以获得c[i]的价值,问我们最多可以得到多少价值,变化是把a[i]=(a[i]+a[i]/x),x是任意数,这是一场操作,总共有k次操作(这一部分像不像一个背包问题,问总共有k空间,问背包最多可以获得的价值),不过我们还需要知道让1变成a[i]的“空间”是多大,我们可以看到a[i]的范围是1到1e3,那么这个问题就很好办了,我们可以提前暴力求出每一个1变成a[i]的“空间”大小,我这里用f[i]表示,求出这个,后面就是经典的背包问题了

#include <iostream>
#include <cstring>
#include <stdlib.h>
using namespace std;
const int maxn=1e6+10;
//#define int long long 
int t,n,k,f[maxn],a[maxn],b[maxn],dp[maxn];
void init()
{
    for (int i=1;i<=1000;i++)//记得一定要预处理,后面要求Min
    {
        f[i]=1e9;
    }
    f[1]=0;
    for (int i=1;i<=1000;i++)
    {
        for (int j=1;j<=i;j++)
        {
            f[i+i/j]=min(f[i+i/j],f[i]+1);
        }
    }
    return ;
}
void solve()
{
    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for (int i=1;i<=n;i++)
    {
        cin>>b[i];
    }
    for (int i=0;i<=k+10;i++)
    {
        dp[i]=0;
    }
    for (int i=1;i<=n;i++)//把这些看成是一个简单的背包问题,f[a[i]]是a[i]的空间,b[i]是a[i]的价值
    {
        for (int j=k;j>=f[a[i]];j--)
        {
            dp[j]=max(dp[j],dp[j-f[a[i]]]+b[i]);
        }
    }
    cout<<dp[k]<<'\n';
    return ;
}
signed main ()
{
    cin>>t;
    init();
    while (t--)
    {
        solve();
    }
    system ("pause");
    return 0;
}
posted @   righting  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示