AtCoder Beginner Contest 417 (A-E题解)

比赛链接

总体总结

A,B题纯模拟

C题 公式一步转换

D题 五题里面最难的,dp预处理+二分

E题 排序+BFS

题解

A题 A Substring

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,n;
int a,b;
string s;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>a>>b;
    cin>>s;
    for(int i=a;i<n-b;i++)
    {
        cout<<s[i];
    }
    cout<<endl;

    return 0;
}

B题 Search and Delete

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef long long ll;
int t,n,m;
int a[N];
int b[N];

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
        cin>>n>>m;
        for(int i=0;i<n;i++)cin>>a[i];
        for(int i=0;i<m;i++)cin>>b[i];
        sort(b,b+m);
        int cnt=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]==b[cnt])a[i]=0,cnt++;
            else 
            {
                while(cnt<m&&a[i]>b[cnt])cnt++;
                if(cnt<m&&a[i]==b[cnt])a[i]=0,cnt++;
            }
            if(cnt==m)break;
        }
        for(int i=0;i<n;i++)
        {
            if(a[i]!=0)cout<<a[i]<<' ';
        }
    
    return 0;
}

C题 Distance Indicators

\[j-i = A_i+A_j $$$$ j-A_j = i+A_i \]

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int t,n;
int a[N];
int cnt[2*N];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    ll ans=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        int x = i - a[i];
        if(x>=1&&cnt[x])ans+=cnt[x];
        cnt[i+a[i]]++;
    }
    cout<<ans<<endl;

    return 0;
}

D题 Takahashi's Expectation

首先dp预处理,dp[i][j]表示在第i个礼品时候的心情为j时,最后的心情是多少

然后用lower_bound(),求出什么时候mood小于前缀和presum,然后根据求出的位置,进行计算,如果求出,位置在结尾之后,说明一开始的心情过高,最后答案就是mood-presum[n]

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long ll;
int t,n;
int p[N],a[N],b[N];
int presum[N];
int dp[N][1001];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i]>>a[i]>>b[i];
        presum[i]=presum[i-1]+b[i];
    }

    for(int i=0;i<=1000;i++)dp[n+1][i]=i;
    for(int i=n;i>=1;i--)
    {
        for(int j=0;j<=1000;j++)
        {
            if(j>p[i])
            {
                dp[i][j]=dp[i+1][max(0,j-b[i])];
            }
            else
            {
                dp[i][j]=dp[i+1][j+a[i]];
            }
        }
    }


    int q;
    cin>>q;
    while(q--)
    {
        int x;
        cin>>x;
        int mid = lower_bound(presum+1,presum+n+1,x-500)-presum;
        if(mid==n+1)
        {
            cout<<x-presum[n]<<endl;
        }
        else
        {
            cout<<dp[mid][x-presum[mid-1]]<<endl;
        }
    }


    return 0;
}

E题 A Path in A Dictionary

每次先把所有节点的边进行从小到大排序,然后bfs遍历每一个点,时间复杂度为O(n),求出字典序最小的路径

复制代码
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,n;
int m,x,y;
bool flag = false;
bool vis[1001];
vector<ll>res;
vector<ll>graph[1001];
void dfs(int cur)
{
    if(flag)return;
    if(cur==y)
    {
        for(int i=0;i<res.size();i++)cout<<res[i]<<' ';
        cout<<endl;
        flag = true;
        return ;
    }

    for(auto it:graph[cur])
    {
        if(vis[it])continue;
        res.push_back(it);
        vis[it]=true;
        dfs(it);
        res.pop_back();
    }


    
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>t;
    while(t--)
    {
        flag =false;
        memset(vis,false,sizeof(vis));
        cin>>n>>m>>x>>y;
        for(int i=1;i<=1000;i++)graph[i].clear();
        for(int i=1;i<=m;i++)
        {
            int f,t;
            cin>>f>>t;
            graph[f].push_back(t);
            graph[t].push_back(f);
        }
        for(int i=1;i<=n;i++)sort(graph[i].begin(),graph[i].end());
        vis[x]=true;
        res.push_back(x);
        dfs(x);
        res.clear();

    }


    return 0;
}
相关推荐
天选之女wow2 天前
【代码随想录算法训练营——Day43(Day42周日休息)】动态规划——300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
算法·leetcode·动态规划
前端小L2 天前
动态规划的“数学之魂”:从DP推演到质因数分解——巧解「只有两个键的键盘」
算法·动态规划
2401_840105204 天前
P1049 装箱问题 题解(四种方法)附DP和DFS的对比
c++·算法·深度优先·动态规划
Juan_20124 天前
P1040题解
c++·算法·动态规划·题解
Onesoft%J1ao4 天前
C++竞赛递推算法-斐波那契数列常见题型与例题详解
c++·算法·动态规划·递推·信息学奥赛
Brookty4 天前
【算法】前缀和
java·学习·算法·前缀和·动态规划
M17迪Pq:00075 天前
学会“做减法”之--用户体验优化
人工智能·贪心算法·产品运营·动态规划·软件工程
BanyeBirth5 天前
C++动态规划——LIS(最长不下降子序列)
算法·动态规划
豆沙沙包?6 天前
2025年--Lc187--120. 三角形最小路径和(多维动态规划,矩阵)--Java版
java·矩阵·动态规划
敲上瘾6 天前
单序列和双序列问题——动态规划
c++·算法·动态规划