概述
D - At Most 3 (Contestant ver.)
题意:给定 W < = 1 e 6 W <= 1e6 W<=1e6 构造一个长度不超过300的数组 使得数组中任意一个数字,任意两个数字相加,任意三个数字相加组成的数 能得到 1 − W 1-W 1−W 间的所有数字。
贪心构造:参照了tourist佬的代码 构造的合理性证明放在代码后的注释中
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
printf("300n");
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
待补
最后
以上就是开心玉米为你收集整理的Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)的全部内容,希望文章能够帮你解决Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复