ACM International Collegiate Programming Contest, Asia Regional 2019, Japan

A
一个硬模拟,

第一次操作最早在 timestamp = 1 时才能进行,题目中没有标注,图倒是标注了,wa了一发

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define ll long long
#define inf 0x3f3f3f3f
#define debug(x) cerr << #x << x << '\n'
using namespace std;

int main(){
    ll n;
    scanf("%lld",&n);
    if(n == 0)
        printf("0\n");
    else{
        n -= 1;//注意
        ll ans = 1;//注意
        ll t = 3;
        while( t <= n ){
            if(n >= 2 * t){
                n -= 2 * t;
                ans += 2;
            }
            else if(n >= t){
                n -= t;
                ans += 1;
                break;
            }
            t *= 3;
        }

        while(n){
            if(n >= t){
                while(n >= t){
                    n -= t;
                    ans ++;
                }
            }
            t /= 3;
        }

        printf("%lld\n",ans);
    }
    return 0;
}

B

一个优先队列的签到题,

"NO"的"O"应该小写,wa了两发,难受,感觉最近代码的小错误出的不少,可能是最近训练有点累了

大顶堆向下挨个 -1 求的是最小值,小顶堆向上挨个 +1 求的是最大值

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#define ll long long
#define inf 0x3f3f3f3f
#define debug(x) cerr << #x << x << '\n'
using namespace std;

const int N = 200, M = 200;

int n, m;
int z[N][M];

struct node{
    int x, y, w;
    bool operator < (const node &a) const{
        return a.w > w;
    }
};

priority_queue <node> q;
int xl[4] = {0,0,1,-1};
int yl[4] = {1,-1,0,0};

void hanshu(){
    node no;
    node nol;
    int k = 0;

    while(!q.empty()){
        no = q.top();
        q.pop();
        for(int i = 0;i < 4;i ++){
            int lx = no.x + xl[i];
            int ly = no.y + yl[i];
            if(lx >= 1 && lx <= n && ly >= 1 &&ly <= m){
                if(z[lx][ly] == -1000){
                    z[lx][ly] = no.w - 1;
                    nol.x = lx;
                    nol.y = ly;
                    nol.w = z[lx][ly];
                    q.push(nol);
                }
                else if(abs(z[lx][ly] - z[no.x][no.y]) > 1){
                    k = 1;
                    break;
                }
            }
        }
        if(k == 1)
            break;
    }
    if(k == 1){
        printf("No\n");
    }
    else{
        ll all = 0;
        for(int i = 1;i <= n; i++)
            for(int j = 1;j <= m;j ++)
                all += z[i][j];
        printf("%lld\n",all);
    }
    return ;
}

int main(){
    int _;
    int a, b, l;
    node no;
    scanf("%d%d%d", &n, &m, &_);

    for(int i = 1;i <= n; i++)
        for(int j = 1;j <= m;j ++)
            z[i][j] = -1000;

    while(_--){
        scanf("%d%d%d", &a, &b, &l);
        z[a][b] = l;
        no.x = a;
        no.y = b;
        no.w = l;
        q.push(no);
    }
    hanshu();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值