AtCoder Beginner Contest 175总结

本文详细解析了五道ACM竞赛题目,包括RainySeason、MakingTriangle、WalkingTakahashi、MovingPiece和PickingGoods,涵盖了分类讨论、暴力求解、数学问题、动态规划等算法策略,展示了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次做了ABCE~

A - Rainy Season

懒得想直接分类讨论

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<string>
#include<iostream>
using namespace std;
int main()
{
    string s;
    cin>>s;
    int res=0;
    if(s[0]=='R'&&s[1]=='R'&&s[2]=='R') cout<<3<<endl;
    else if(s[0]=='R'&&s[1]=='R'||s[1]=='R'&&s[2]=='R') cout<<2<<endl;
    else if(s[0]=='S'&&s[1]=='S'&&s[2]=='S') cout<<0<<endl;
    else cout<<1<<endl;
    return 0;
}

B - Making Triangle

直接暴力

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=110;
ll a[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+1+n);
    int res=0;
    for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
            {
                if(a[i]==a[j]||a[i]==a[k]||a[j]==a[k]) continue;
                if(a[i]+a[j]>a[k]) res++;
            }
    cout<<res<<endl;
    return 0;
}

C - Walking Takahashi

数学题,先走到最近的。看看还剩几步能走分类一下即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll x,k,d;
int main()
{
    cin>>x>>k>>d;
    ll cnt=abs(x)/d;
    if(k<=cnt) cout<<abs(x)-d*k<<endl;  
    else
    {
        ll now=abs(x)-d*cnt;
        if((k-cnt)&1) cout<<abs(now-d)<<endl;
        else cout<<now<<endl;
    }
    return 0;
}

D - Moving Piece

考场一直调都没调出来wtcl
预处理dist[i][j]数组,表示从i开始走j步能够得多少分。circle[i]表示从i开始走一圈会走多少步。暴力枚举每一个点为起点开始走,然后暴力枚举从该点开始走最终停到那个点。计算得分取最大。时间复杂度O(n2)O(n^2)O(n2)

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=5010;
ll dist[N][N],circle[N],mark[N];
bool st[N];
int pos[N],n;
ll k;
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>pos[i];
    for(int i=1;i<=n;i++) cin>>mark[i];
    for(int i=1;i<=n;i++)
    {
        memset(st,0,sizeof st);
        int j=pos[i],idx=0;
        while(!st[j])
        {
            st[j]=1;
            idx++;
            dist[i][idx]=dist[i][idx-1]+mark[j];
            j=pos[j];
        }
        circle[i]=idx;
        
    }
    ll res=-1e18;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=circle[i];j++)
        {
            ll x=dist[i][j];
            if(k<j) break;
            if(dist[i][circle[i]]>=0) x+=(k-j)/circle[i]*dist[i][circle[i]];
            res=max(res,x);
        }
    cout<<res<<endl;
    return 0;
}

E - Picking Goods

动态规划f[i][j][k]f[i][j][k]f[i][j][k]方格取数
状态表示:①集合:走到第iii行第jjj列,并且第iii行已经选择了kkk个的集合②属性:最大值
状态计算:
向右走
不选第iii行第jjj列:f[i][j][k]=f[i][j−1][k]f[i][j][k]=f[i][j-1][k]f[i][j][k]=f[i][j1][k]
选择第iii行第jjjf[i][j][k]=f[i][j−1][k−1]+g[i][j]f[i][j][k]=f[i][j-1][k-1]+g[i][j]f[i][j][k]=f[i][j1][k1]+g[i][j]
向下走
不选第iii行第jjjf[i][j][0]=f[i−1][j][0…k]f[i][j][0]=f[i-1][j][0\dots k]f[i][j][0]=f[i1][j][0k]
选择第iii行第jjjf[i][j][1]=f[i−1][j][0…k]+g[i][j]f[i][j][1]=f[i-1][j][0\dots k]+g[i][j]f[i][j][1]=f[i1][j][0k]+g[i][j]

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=3010;
ll g[N][N];
int n,m,k;
ll f[N][N][4];
int main()
{
    cin>>n>>m>>k;
    while(k--)
    {
        int x,y;
        ll w;
        cin>>x>>y>>w;
        g[x][y]=w;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            //不选择这一个格子
            ll w=max(max(f[i-1][j][0],f[i-1][j][1]),max(f[i-1][j][2],f[i-1][j][3]));
            for(int k=0;k<=3;k++) f[i][j][k]=max(f[i][j][k],f[i][j-1][k]);
            f[i][j][0]=max(f[i][j][0],w);
            if(g[i][j])//说明这个格子有数才能选择
            {
            	//选择这一个格子
                for(int k=1;k<=3;k++) f[i][j][k]=f[i][j-1][k-1]+g[i][j];
                f[i][j][1]=max(f[i][j][1],w+g[i][j]);
            }
        }
    cout<<max(max(f[n][m][0],f[n][m][1]),max(f[n][m][2],f[n][m][3]))<<endl;
    return 0;
}

要加油哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值