AtCoder Beginner Contest 307(E,F,G)
AtCoder Beginner Contest 307(E,F,G)
E(dp)
这个题大意就是我们需要组成一个长度为
题目大意很简单,就是有点难想,如果
我们可以记录每一位和第一位选择的数字之间的关系,是否相等
我们先假定这第一位为一个数字,后面我们只需要
然后对于每一位数字的选择
所以我们可以得到状态转移方程
如果这一位选择的是和第一位是一样的,那么前一位只能是和第一位不一样的
如果这一位选择的是和第一位是不一样的,那么前一位可以是和第一位不一样的,选择减去前一位和第一位,前一位可以和第一位是一样的,那么这一位的选择减去第一位即可
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long
#define LL long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-6
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=1e6+10;
const int mod=998244353;
int t;
int n,m;
int dp[maxn][2];
void solve()
{
cin>>n>>m;
dp[1][1]=1;
dp[1][0]=0;
for (int i=2;i<=n;i++)
{
dp[i][1]=dp[i-1][0];
dp[i][0]=((dp[i-1][0]*(m-2))%mod+(dp[i-1][1]*(m-1))%mod)%mod;
}
int ans=dp[n][0];
ans=(ans*m)%mod;
cout<<ans<<"\n";
return ;
}
signed main ()
{
//ios;
// cin>>t;
t=1;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
F(dijkstra)
这个题的大意就是有
问,对于每一个房间,第一次被感染的时间是多少
对于每一次,我们可以判断由上一次被感染的房间到达的下一个房间的区间
如果满足距离的条件,那么就是这一天被感染的,在前面的步骤都已经判断好了,我们需要再次更新此次被感染的房间的下一个房间的距离,后面再一次判断,知道到达最后一天
具体操作可以看代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long
#define LL long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-6
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=3e5+10;
const int mod=998244353;
int t;
int n,m,k,d;
int a[maxn],x[maxn],ans[maxn];
vector<pair<int,int>>g[maxn];
int dis[maxn];
void solve()
{
cin>>n>>m;
for (int i=1;i<=n;i++)
{
ans[i]=-1;
vis[i]=false;
dis[i]=inf;
}
priority_queue<pair<int,int>>q;
for (int i=1;i<=m;i++)
{
int u,v,val;
cin>>u>>v>>val;
g[u].push_back({v,val});
g[v].push_back({u,val});
}
cin>>k;
for (int i=1;i<=k;i++)
{
int u;
cin>>u;
dis[u]=0;
ans[u]=0;
for (auto [v,val]:g[u])
{
if(dis[v]>dis[u]+val)
{
dis[v]=dis[u]+val;
q.push({-dis[v],v});
}
}
}
cin>>d;
for (int i=1;i<=d;i++)
{
int dis1;
cin>>dis1;
vector<int>infected;
while (!q.empty())
{
auto [dis2,u]=q.top();
if(dis[u]>dis1) break;
q.pop();
if(ans[u]!=-1) continue;
ans[u]=i;
infected.push_back(u);
for (auto [v,val]:g[u])
{
if(dis[v]>dis[u]+val)
{
dis[v]=dis[u]+val;
q.push({-dis[v],v});
}
}
}
for (auto u:infected)
{
for (auto [v,val]:g[u])
{
if(dis[v]>val)
{
dis[v]=val;
q.push({-dis[v],v});
}
}
}
}
for (int i=1;i<=n;i++)
{
cout<<ans[i]<<"\n";
}
return ;
}
signed main ()
{
//ios;
// cin>>t;
t=1;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
G(dp)
这个题的大意为给你一个数组,我们把这个数组按照下面的操作
把这个数组的极差小于等于
要想极差尽量少,那么我们就可以把这
我们可以设计一个
然后我们在考虑每一种状态时需要的操作数量
对于每一个数字,它只有两种目标
但是对于
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long
#define LL long long
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-6
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=5e3+10;
int t;
int n,a[maxn];
void solve()
{
cin>>n;
int sum=0;
for (int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
}
int ave=sum/n;
int mod=sum%n;
if(mod<=0)
{
mod+=n;
ave--;
}
vector<int>dp1(mod+2,inf);
dp1[0]=0;
sum=0;
int now=0;
for (int i=1;i<=n;i++)
{
vector<int>dp2(mod+2,inf);
for (int last=0;last<=mod;last++)
{
int val=0;
int need=now+last-sum;
int cur=a[i]-need;
val=abs(cur-(ave+1));
if(last!=mod)dp2[last+1]=min(dp2[last+1],dp1[last]+val);
val=abs(cur-(ave));
dp2[last]=min(dp2[last],dp1[last]+val);
}
sum+=a[i];
now+=ave;
dp1=dp2;
}
int ans=dp1[mod];
cout<<ans<<"\n";
return ;
}
signed main ()
{
//ios;
// cin>>t;
t=1;
while (t--)
{
solve();
}
system ("pause");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)