其他分享
首页 > 其他分享> > AtCoder Grand Contest 044

AtCoder Grand Contest 044

作者:互联网

题外话,昨天我写的题解被电脑重启还原卡搞没了


A - Pay to Win

题意:简单来说 题意就是 给一个N 然后给了4种操作的代价 求最小的代价。

sol.可以发现,对于每一次操作,如果要进行乘除法操作,那么肯定应该不留余数

那么只要对 数进行上下取证考虑就好了

#include<bits/stdc++.h>
typedef long long ll;
#define INF 0x7fffffffffffffff
using namespace std;

ll T,n,a[5],p[5] = {2 , 3 , 5},D;

map<ll , ll>judge;

ll f(ll x){
	if(judge.count(x))return judge[x];
	ll zz = INF;
	ll L,R;
	for(int i = 0 ; i < 3 ; i++){
		L = (x / p[i]) * p[i];
		R = ((x + p[i] - 1ll) / p[i]) * p[i];
		zz = min(zz , f(L / p[i]) + abs(x - L) * D + a[i]);
		zz = min(zz , f(R / p[i]) + abs(R - x) * D + a[i]);
	}
	if(x < zz / D)zz = x * D;
	judge[x] = zz;
	return zz;
}

int main(){
	scanf("%lld" , &T);
	while(T--){
		judge.clear();
		scanf("%lld%lld%lld%lld%lld" , &n , &a[0] , &a[1] , &a[2] , &D);
		judge[0] = 0 , judge[1] = D;
		cout<<f(n)<<endl;
	}
}

B - Joker

题意:在\(n\times n的矩阵里面\),有一个 人依次出来的顺序,要求每次出来的人 经过已经有人的格子的个数尽量少,问总和

sol.发现你bfs的过程,答案是一个单调的,每次bfs直接继承就好了

C - Strange Dance

题意:给你\(0-->3^n-1\)的排列,有两种操作,

1> 将排列的每一个数3进制下,1转变为2,2转变为1,

2> 每一个数 + 1 , 且\(mod\ 3^n\)

问最后整个序列的每一个元素的值

sol.直接建一个(0/1/2 trie)就好了,好像还是联合省选原题,zroi原题

标签:AtCoder,题意,Contest,ll,sol,lld%,zz,judge,044
来源: https://www.cnblogs.com/Yeyuqing0913/p/15514669.html