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;
}