Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)

D - At Most 3 (Contestant ver.)

题意:给定 W < = 1 e 6 W <= 1e6 W<=1e6 构造一个长度不超过300的数组 使得数组中任意一个数字,任意两个数字相加,任意三个数字相加组成的数 能得到 1 − W 1-W 1W 间的所有数字。

贪心构造:参照了tourist佬的代码 构造的合理性证明放在代码后的注释中

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
    printf("300\n");
    for(int i=1;i<=100;i++)
    {
        printf("%d %d %d ",i,i*100,i*10000);
    }

    return 0;
}
/*
按数位来划分
1.1~100 
2.100 ~ 10000 中 相隔100的数都存在
3.10000 ~ 1000000 中 相隔10000的数都存在
所有的一位数都存在1中
所有的两位数都存在1中
所有的三位数 百位都在2中存在 十位个位在1中存在 例如 983 900在2中存在 83在1中存在 
所有的四位数 千位和百位数都在2中存在 十位数个位数在1中存在 例如:1234 1200在2中存在 34在1中存在 最多需要两个数字来构成
所有的五位数 万位数都在3中存在 剩下的数字可以参照四位数的构造情况 例如81234 80000 1200 34
所有的六位数 十万位和万位数都在3中 剩下的数参照四位数的构造
所有的七位数 因为W <= 1000000 所以七位数只有一个 在3中存在 
*/

E Tahakashi and Animals

题意 n n n条狗,喂每个狗的花费为 a i ai ai 喂第 i i i条狗的同时也会喂将 i + 1 i+1 i+1号狗喂一遍 例如 喂1号狗花费2 喂2号狗花费10 那么我可以花费2将1,2号狗都喂到。特别的喂 n n n号狗的时候也会喂到 1 1 1号狗

状态机:队内大佬教我的,解析在代码注释中

#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int N = 3e5 + 10;
int n,a[N];
ll f[N][2];
/*
状态机模型
f[i][0] 1,0代表喂或不喂i狗
对于i号狗来说 一定要喂i-1狗或者喂自己

f[i][0] 既然自己不喂,说明一定喂了i-1号狗 f[i][0] = f[i-1][1]
f[i][1] 喂自己,不管之前的狗喂或不喂都可以喂自己 取最小值+喂自己的费用  = min(f[i-1][0],f[i-1][1]) + a[i]

特别的因为存在特殊的环 即喂n号狗也会喂到1号狗
那么要对初始分两种情况讨论 
1.一定喂1号狗 n号狗随状态机转移得到 for(2~n)
2.一定喂n号狗 1号狗加入状态机模型 for(1~n-1)
*/
int main()
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++) cin >> a[i];
    
    //因为一定喂1号狗,那么就不存在不喂的情况 f[1][0] = f[1][1]
    f[1][1] = a[1];
    f[1][1] = a[1];
    for(int i=2;i<=n;i++)
    {
        f[i][0] = f[i-1][1];
        f[i][1] = min(f[i-1][0],f[i-1][1]) + a[i];
    }
    ll res1 = min(f[n][0],f[n][1]);

    //将0号视为n号狗 与一定喂1号狗的情况同理
    f[0][1] = a[n];
    f[0][1] = a[n];
    for(int i=1;i<n;i++)
    {
        f[i][0] = f[i-1][1];
        f[i][1] = min(f[i-1][0],f[i-1][1]) + a[i];
    }
    ll res2 = min(f[n-1][0],f[n-1][1]);
    cout << min(res1,res2);
    return 0;
}

F Two Spanning Trees

待补

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值