QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#640332#5117. Find MaximumPonyHexWA 1ms3612kbC++202.8kb2024-10-14 11:03:002024-10-14 11:03:01

Judging History

你现在查看的是最新测评结果

  • [2024-10-14 11:03:01]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3612kb
  • [2024-10-14 11:03:00]
  • 提交

answer

#define _CRT_SECURE_NO_WARNINGS 1
#include<bits/stdc++.h>
#include<unordered_map>
#include<unordered_set>
using namespace std;
#define double long double
//#define int long long
#define lc u<<1
#define rc u<<1|1
#define endl "\n"
#define X first
#define Y second
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int, int> PII;
const ll N = 1e6 + 50;
const ll maxm = 2e18;
const ll mod = 998244353;

ll exgcd(ll a, ll b, ll& x, ll& y);

ll dfs(ll x) {
    if (x == 0)return 1;
    if (x > 0 && x % 3 == 0)return dfs(x / 3) + 1;
    if (x > 0 && x % 3 != 0)return dfs(x - 1) + 1;
}

ll base[50];

ll ksm(ll a, ll b) {
    ll base = a;
    ll ans = 1;
    while (b) {
        if (b & 1)ans *= base;
        base *= base;
        b >>= 1;
    }
    return ans;
}

void solve()
{
    //复盘一下,化为三进制后,我们观察所有第一次出现的元素的三进制发现,
    //他比前置元素都大,而他的三进制最后的几位全部是2,猜测,越放2越优
    //观察题目中给的式子,在三进制尺度下,我们发现,三进制每个位置上的数字越大
    //获取操作三的次数越多,加1越多,第二个操作本质是右移操作
    //除三操作,这意味着我们一直向前找比r小的元素,然后再某一位减1
    //对后面全赋二,这样就找到更优的一种情况,

    //cout << ksm(3, 50) << endl;
    ll l, r; cin >> l >> r;
    for (int i = 0; i <= 49; i++)base[i] = 0;
    ll idx = -1, midd = r;
    while (midd) {//完,先得到的是最高位
        base[++idx] = midd % 3;
        midd /= 3;
    }
    /*
    for (int i = 0; i <= idx; i++)cout << base[i];
    cout << endl;*/
    ll ans = dfs(r); ll cnt = 0;
    for (ll i = 0; i<=idx; i++) {
        ll mid = r;
        if (base[i] == 0) {
            cnt++;
            continue;
        }
        mid -= ksm(3, cnt);
        for (ll j = 0; j < cnt; j++) {
            mid += 2 * ksm(3, j);
            mid -= base[j] * ksm(3, j);
        }
        ans = max(ans, dfs(mid));
        //cout <<mid<<" "<< dfs(mid) << endl;
        cnt++;
    }
    cout << ans << endl;
    return;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    ll t = 1; cin >> t;
    while (t--)solve();
    return 0;
}
/*PonyHex*/


ll exgcd(ll a, ll b, ll& x, ll& y) {
    if (b == 0) {
        x = 1; y = 0;
        return a;
    }
    ll g = exgcd(b, a % b, x, y);
    ll temp = x;
    x = y;
    y = temp - (a / b) * y;
    return g;
}
/*
1
11
1 2 3 2 5 6 7 6 9 1
*/
/*
ll ksm(ll a, ll b) {
    ll base = a;
    ll ans = 1;
    while (b) {
        if (b & 1)ans *= base;
        base *= base;
        b >>= 1;
    }
    return ans;
}*/
/*
ll gcd(ll a, ll b) {
    return b ? gcd(b, a % b) : a;
}*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3572kb

input:

10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5

output:

3
3
4
5
3
4
5
4
5
5

result:

ok 10 numbers

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 3612kb

input:

5050
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
1 12
1 13
1 14
1 15
1 16
1 17
1 18
1 19
1 20
1 21
1 22
1 23
1 24
1 25
1 26
1 27
1 28
1 29
1 30
1 31
1 32
1 33
1 34
1 35
1 36
1 37
1 38
1 39
1 40
1 41
1 42
1 43
1 44
1 45
1 46
1 47
1 48
1 49
1 50
1 51
1 52
1 53
1 54
1 55
1 56
1 57
1 58
1 59
1 60
1 61...

output:

2
3
3
4
5
5
5
6
6
6
6
6
6
7
7
7
8
8
8
8
8
8
8
8
8
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
9
10
10
10
10
10
10
10
10
10
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
11
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
12
3
3
4
5
5
5
6
6
6
6
6
6
7
7
7
8
8
8
8
8
8
8...

result:

wrong answer 491st numbers differ - expected: '4', found: '5'