[Codeforces Round #436](Div. 2)

博主分享了CF定级赛的经历,详细解析了C题和E题的解题思路及代码实现,C题通过判断条件和模拟行走过程解决,E题采用动态规划方法求解最大价值。

比赛题目
博主果然很蠢。。。CF定级赛打残了。。。挂了一道水水水水题。。。
时间范围绰绰有余的是前4道题
而博主把C的纯模拟挂了( ̄_, ̄ ),rating-7,好好好我已经很满意了

C题:

如果ta要求的是单程路,只要b>f && b>a-f 都是可以有解的
如果ta要求的不是单程路,只要b>2*f && b>(a-f)*2都是可以有解的
然后纯模拟路程情况就可以了啊
如果走下半程的路走不下去了,就(在思想上)跑到已经过去的加油站加上油再走,ans++
代码简洁:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int now,a,b,f,k,ans;
int main()
{
    int i;
    scanf("%d%d%d%d",&a,&b,&f,&k),now=b;
    if(b<f||b<a-f||(k>1&&b<(a-f)*2)||(k>2&&b<f*2))
    {
        printf("-1");
        return 0;
    }
    for(i=1;i<=k;i++)
    {
        if(i&1)
        {
            if(now<f)   now=b-f,ans++;
            now-=f;
            if(now<a-f) now=b,ans++;
            now-=a-f;
        }
        else
        {
            if(now<a-f) now=b-(a-f),ans++;
            now-=a-f;
            if(now<f)   now=b,ans++;
            now-=f;
        }
    }
    printf("%d\n",ans);
    return 0;
}

E题:

因为博主的愚蠢,这道题还没大看就over了
这个题不是一个背包嘛。。。。好的f[i]表示前i时间的最大价值
记录方案用vector很方便,二维数组也是资瓷的

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
struct hh{int t,d,z,id;}a[105];
int f[2005];
vector<int>s[2005],m;
int cmp(hh a,hh b){return a.d<b.d;}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for (i=1;i<=n;i++) scanf("%d%d%d",&a[i].t,&a[i].d,&a[i].z),a[i].id=i;
    sort(a+1,a+n+1,cmp);
    for (i=1;i<=n;i++) 
      for (j=a[i].d-1;j>=a[i].t;j--)
        if (f[j]<f[j-a[i].t]+a[i].z)
        {
            f[j]=f[j-a[i].t]+a[i].z;
            s[j]=s[j-a[i].t];
            s[j].push_back(a[i].id);
        }
    int maxx=0;
    for (i=0;i<=2000;i++)
      if (f[i]>maxx)
      {
        maxx=f[i];
        m=s[i];
      }
    printf("%d\n%d\n",maxx,m.size());
    for (i=0;i<m.size();i++)
      printf("%d ",m[i]);
}

Emmm…补一句,其实青名我也很喜欢。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值