首页 > 其他分享 >ATcoder ABC 358 补题记录(A~D,G)

ATcoder ABC 358 补题记录(A~D,G)

时间:2024-06-15 22:21:27浏览次数:11  
标签:ATcoder 结点 ABC int cin long times 55 补题

A

直接模拟即可。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100,mod=998244353;
int a[N];
signed main(){
    string s,t;
    cin>>s>>t;
    if(s=="AtCoder"&&t=="Land")cout<<"Yes\n";
    else cout<<"No\n";
}

B

直接模拟即可。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100,mod=998244353;
int a[N];
signed main(){
    int n,t;
    cin>>n>>t;
    for(int i=1;i<=n;i++)cin>>a[i];
    int now=-1e18;
    for(int i=1;i<=n;i++){
        int xu=now;
        if(xu<=a[i])now=a[i]+t;
        else now=xu+t;
        cout<<now<<'\n';
    }
}

C

发现 \(n\) 很小,所以直接暴力枚举每一个状态,并判断这个状态是否可以覆盖所有的爆米花。如果可以覆盖那么当前状态的位数就是当前所用的摊位的数量。取最小值即可。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100,mod=998244353;
char s[3010][3010];
signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++)scanf("%s",s[i]);
    int cost=233;
    for(int i=1;i<(1ll<<n);i++){
        set<int>se;
        for(int j=0;j<n;j++)if(i>>j&1)
        for(int k=0;k<m;k++)if(s[j][k]=='o')
        se.insert(k);
        if(se.size()==m)cost=min(cost,(int)__builtin_popcountll(i));
    }
    cout<<cost<<'\n';
}

D

对于每一个人 \(i\),使用 multiset 找到让她可以满足的,价值最小的礼物分配给她。时间复杂度为 \(O(n\log n)\)。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100,mod=998244353;
int a[N],b[N];
signed main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    multiset<int>se;
    int res=0;
    for(int i=1;i<=n;i++)se.insert(a[i]);
    sort(a+1,a+n+1,greater<>());
    for(int i=1;i<=m;i++){
        auto it=se.lower_bound(b[i]);
        // cout<<"dbg "<<i<<' '<<b[i]<<'\n';
        if(it==se.end()){
            res=-1;
            break;
        }
        res+=*it;
        se.erase(it);
    }
    cout<<res<<'\n';
}

G

实际上 CF57E 也有一个(有点)类似的结论。

容易发现 \(n\times m\) 步之后一定可以到达任意的一个结点。因此 \(n\times m\) 步之后一定是停在某一个结点攒贡献。所以设 \(f_{i,j,k}\) 表示当前走了 \(i\) 步,目前位于结点 \((j,k)\) 的最大收益。很显然每一个 \(f_{i,j,k}\) 都可以从 \((j,k)\) 结点本身和 \((j,k)\) 结点四连通的结点转移而来。

此时若 \(k\le n\times m\) 则答案已经求出,\(k>n\times m\) 则枚举最后到达的每一个结点 \((i,j)\),这个结点的最大贡献就是 \(f_{n\times m,i,j}+(n\times m-k)\times a_{i,j}\)。可能这个贡献并不一定是最大贡献,但是最大贡献一定可以通过这种方式得到。

时间复杂度为 \(O(n^2m^2)\)。

#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1000100,mod=998244353;
int a[55][55],f[55*55][55][55];
//设f[i][j][k]表示现在是第i个操作, 当前位于(j,k)
signed main(){
    int n,m,k;
    cin>>n>>m>>k;
    int si,sj;
    cin>>si>>sj;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    cin>>a[i][j];
    memset(f,-0x3f,sizeof f);
    f[0][si][sj]=0;
    for(int i=1;i<=min(n*m,k);i++){
    for(int j=1;j<=n;j++)
        for(int k=1;k<=m;k++)
            f[i][j][k]=f[i-1][j][k]+a[j][k];
    for(int j=1;j<=n;j++)
        for(int k=1;k<=m;k++){
            const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
            for(int d=0;d<4;d++){
                int x=j+dx[d],y=k+dy[d];
                if(x>=1&&x<=n&&y>=1&&y<=m)
                    f[i][x][y]=max(f[i][x][y],f[i-1][j][k]+a[x][y]);
            }
        }
    }
    if(k<=n*m){
        int res=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        res=max(res,f[k][i][j]);
        cout<<res<<'\n';
    }else{
        int res=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                int now=f[n*m][i][j]+(k-n*m)*a[i][j];
                res=max(res,now);
            }
        cout<<res<<'\n';
    }
}

标签:ATcoder,结点,ABC,int,cin,long,times,55,补题
From: https://www.cnblogs.com/yhbqwq/p/18249845

相关文章

  • ABC 322 E Product Development
    题意公司要升级一个产品的K种属性,每种的初始值为0。有N种升级计划,第i种花费c[i]的代价给编号为j=1,2,...,K的属性分别增加a[i][j],求把所有属性提升到大于等于P的最小代价题解显然多维费用背包,定义dp[t][i][j][k][s][r]为前t个物品,让这几种属性为i,j,k,s,r的时候的最小费用。在......
  • 「杂题乱刷」AT_abc161_d
    代码恢复训练2024.6.14.bfs板子题。链接(luogu)链接(atcoder)代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?打cf不要用umap!!!记住,rating是身外之物。该冲正解时冲正解!Problem:算法:思......
  • ABC352
    E-CliqueConnecthttps://atcoder.jp/contests/abc352/tasks/abc352_e最小生成树先复习一下最小生成树,这里用Kruscal生成树(spanningtree):一个连通无向图的生成子图,同时要求是树。也即在图的边集中选择\(n-1\)条,将所有顶点连通。最小生成(MinimumSpanningTree,MST):边......
  • 文件IO,创建编号为ABC三个线程,三个线程循环打印自己的编号,要求打印出来的结果必须是ABC
    第二个,拷贝图片#include<myhead.h>typedefstruct{ constchar*srcfile; constchar*destfile; intlen;}info;void*task1(void*arg){ infobuf=*((info*)(arg)); //打开这两个文件,只读的形式 intfd=-1; if((fd=open(buf.srcfile,O_RDONLY))==-1) {......
  • ABC348E Minimize Sum of Distances 题解
    ABC348EMinimizeSumofDistances题目大意给定一棵共\(n\)个节点的树,第\(i\)个点的权重为\(c_i\)。定义\(f(x)\)表示树上所有点到节点\(x\)的距离乘上权重,即\(f(x)=\sum\limits_{i=1}^n(c_i\timesdis(x,i))\)。求\(\min\limits_{u=1}^nf(u)\)。Solve一眼换根......
  • ABC 321 E Complete Binary Tree
    题意有T次询问,每次询问给出三个参数N,X,K,分别表示,有N个节点的二叉树,询问从X号节点出发走K条边能走到多少个不同的点。思路对于一颗二叉树上的点,我们可以分两种情况,一种是向上走,一种是向下走。对于向下走,我们只需要不停的、分别的遍历当前节点的右儿子(对于二叉树就是序号乘2),直到......
  • ABC 321 F #(subset sum = K) with Add and Erase
    题意有一个箱子,每次可以向里面添加或者拿走一个数,问每次操作过后,任选箱子里的数相加,总和等于k的方案数是多少。思路萌新算是学到新东西了,这其实是个可撤销背包的板题。我们先考虑一个问题:对于普通计数类dp,我们现在禁用某一个数i,我们现在想知道某一个数j有多少种方式表示(即dp......
  • AT_abc335_d [ABC335D] Loong and Takahashi 题解
    题目传送门题目大意:高桥在一个地图的中心,有一条龙从地图的左上角开始,每次只能到达与他相邻的四个点,现给出地图的边长,请你给出一种方案,使得地图上的每个点除高桥所在的地方外,都被龙走过且不重复。解题思路:首先,我们拿到这个题目,想十秒,便会发现,我们按照螺旋矩阵的方式行走,......
  • bash中$'abc'用法
    在shell脚本或命令行中,$'abc'并不是一个标准的字符串表示方法。通常,shell中的字符串可以用单引号('abc')或双引号("abc")来定义。然而,$'...'这种语法在某些shell环境(如bash)中确实存在,并且它用于处理带有转义字符的字符串。这种语法允许你在字符串中使用特定的转义序列,例如\n......
  • ABC357
    Alink循环加每一个数,加到哪个数不能加了输出前一个数,注意如果加到最后还能加,记得输出\(n\)。点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn,m;inth[105],sum;signedmain(){ cin>>n>>m; for(inti=1;i<=n;++i) cin>>h[i]; for......