Atcoder ABC 176 A-E

自己VP了下这场,ABC似乎越来越水了

A.
贪心水题

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int n,x,t;
    cin>>n>>x>>t;
    cout<<((n%x==0)?(n/x*t):(((n/x)+1)*t));
    return 0;
}

B.
比A还水

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
const int maxn=2e5+5;
char s[maxn];
int main(){
    scanf("%s",s);
    int sum=0;
    for(int i=0;i<strlen(s);++i){
        sum+=(s[i]-'0');
    }
    if(sum%9==0)puts("Yes");
    else puts("No");
    return 0;
}

C.
一眼贪心,从左到右尽量使右边和左边相等即可

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int a[maxn];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d",&a[i]);
    ll ans=0;
    for(int i=2;i<=n;++i)
        if(a[i]<a[i-1])
            ans+=(a[i-1]-a[i]),a[i]=a[i-1];
    cout<<ans<<endl;
    return 0;
}

D.
01bfs,容易发现,使用魔法代价为1,不使用为0,虽然每个节点可能多次入队,但是我们只在更短的时候更新,所以复杂度为O(NM)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<deque>
using namespace std;
const int maxn=1e3+5;
bool is[maxn][maxn];
typedef pair<int,int>Node;
Node s,e;
int h,w,dx[]={0,0,1,-1},dy[]={-1,1,0,0},d[maxn][maxn];
char mp[maxn][maxn];
void bfs(){
    memset(d,0x3f,sizeof(d));
    deque<Node>q;
    d[s.first][s.second]=0;
    q.push_front(s);
    while(!q.empty()){
        Node n1=q.front();
        q.pop_front();
        if(is[n1.first][n1.second])continue;
        is[n1.first][n1.second]=1;
        for(int i=0;i<4;++i){
            int xx=n1.first+dx[i],yy=n1.second+dy[i];
            if(xx<1||yy<1||xx>h||yy>w||mp[xx][yy]=='#'||d[xx][yy]<=d[n1.first][n1.second])continue;
            d[xx][yy]=d[n1.first][n1.second];
            q.push_front({xx,yy});
        }
        for(int i=n1.first-2;i<=n1.first+2;++i){
            if(i<1||i>h)continue;
            for(int j=n1.second-2;j<=n1.second+2;++j){
                if(j<1||j>w||mp[i][j]=='#'||d[i][j]<=d[n1.first][n1.second]+1)continue;
                d[i][j]=d[n1.first][n1.second]+1;
                q.push_back({i,j});
            }
        }
    }   
}
int main(){
    scanf("%d%d",&h,&w);
    scanf("%d%d%d%d",&s.first,&s.second,&e.first,&e.second);
    for(int i=1;i<=h;++i)
        scanf("%s",mp[i]+1);
    bfs();
    if(d[e.first][e.second]==0x3f3f3f3f)puts("-1");
    else cout<<d[e.first][e.second]<<endl;      
    return 0;
}

E.
预处理行列最大值,用map当作bool数组用即可,注意处理交叉点

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=3e5+5;
map<pair<int,int>,bool>mp;
vector<int>a,b;
typedef long long ll;
int r[maxn],c[maxn];
int main(){
    int h,w,n,x,y,mxr,mxc;
    scanf("%d%d%d",&h,&w,&n);
    mxr=mxc=0;
    while(n--){
        scanf("%d%d",&x,&y);
        mp[{x,y}]=1;
        r[x]++;
        c[y]++;
        mxr=max(mxr,r[x]);
        mxc=max(mxc,c[y]);
    }
    for(int i=1;i<=h;++i)
        if(r[i]==mxr)a.push_back(i);
    for(int j=1;j<=w;++j)
        if(c[j]==mxc)b.push_back(j);
    for(auto&v:a)
        for(auto&q:b){
            if(mp[{v,q}]==0){
                cout<<mxr+mxc<<endl;
                return 0;
            }
        }
    cout<<mxr+mxc-1<<endl;
    return 0;
}

F.
咕咕咕,过两天再补

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值