Comet OJ - Contest #15

https://cometoj.com/contest/79/problem/D?problem_id=4219

题目描述

※ 简单版与困难版的唯一区别是粗体字部份和 $v$ 的数据范围。

在双 11 时,心慧精品店有个特别的折价活动如下:

首先,我们定义一个正整数为"好的"当且仅当此数仅由数字 1 构成,举例来说 11111111111 都是「好的」,但 10123321 都是「不好的」。

接着,若一个商品原价为 x,若顾客能把 x 表示为 k 个「好的」数字,那么此顾客就能用 k 元买下它。

小月在心慧精品店里看上了一件原价为 v 的商品,请输出小月最少需要花多少钱才能买下此商品。

题解

因为求由构成数x的最小数字,将问题转换为 x*9 由 9, 99 构成的数,令 u = 9*x, ans为最小个数,所以 u + ans 的 10 的幂和,so u + x 是10的倍数且位数和dig_num <= ans且u + x > 10*x,

然后暴力枚举瞎搞就好了

#include<bits/stdc++.h>
#define rep(i, n) for(int i=0;i!=n;++i)
#define per(i, n) for(int i=n-1;i>=0;--i)
#define Rep(i, sta, n) for(int i=sta;i!=n;++i)
#define rep1(i, n) for(int i=1;i<=n;++i)
#define per1(i, n) for(int i=n;i>=1;--i)
#define Rep1(i, sta, n) for(int i=sta;i<=n;++i)
#define L k<<1
#define R k<<1|1
#define inf (0x3f3f3f3f)
#define llinf (1e18)
#define mid (tree[k].l+tree[k].r)>>1
#define ALL(A) A.begin(),A.end()
#define SIZE(A) ((int)A.size())
typedef long long i64;
using namespace std;
const int MAX_LEN = 1000010;
char str[MAX_LEN];
void solve()
{
    str[0] = 0; scanf("%s",str+1);
    int len = strlen(str+1),dig_num = 0;
    for(int i=1;i<=len;++i)
        str[i] = (str[i] - ‘0‘)*9;
    for(int i=len;i>0;--i){
        str[i-1] += str[i] / 10;
        str[i] %= 10;
        dig_num += str[i];
    }
    dig_num += str[0];
    int ans = 10 - str[len];
    str[len] += ans;
    dig_num += ans;
    while(true){
        for(int i=len;i>0;--i){
            if(str[i] >= 10){
                dig_num -= 9;
                str[i] -= 10;
                ++str[i-1];
            }else
                break;
        }
        if(dig_num <= ans){
            cout << ans <<‘\n‘;
            return;
        }
        ans += 10;
        dig_num += 10;
        str[len] += 10;
    }
}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T;  scanf("%d",&T);
    while(T--)  solve();
    return 0;
}

原文地址:https://www.cnblogs.com/newstartCY/p/11962004.html

时间: 2024-08-30 07:08:05

Comet OJ - Contest #15的相关文章

Comet OJ - Contest #15题解

A 双十一特惠 (简单版) n  <=  1e19,   1e9 > 1(8) https://www.cometoj.com/contest/79/problem/A?problem_id=4198 #include<bits/stdc++.h> using namespace std; int main(){ int t; cin >> t; while(t--) { int cnt1 = 0; int n;cin >> n; int pr[] = {1

符文能量(Comet OJ - Contest #8)

给Comet OJ打个小广告,挺好用的,比较简洁,给人感觉很好用 Contest #8是我打的第一场本oj比赛,很遗憾A了前两道傻逼题就没思路了,然后就不打算打了....... https://www.cometoj.com/contest/58/problem/C?problem_id=2760 怎么做啊完全不会啊我那么菜,虽然看到是dp但嫌太麻烦就放弃了: 靠后仔细想了想原来这道题很简单: 结构体node e[];储存ai,bi值(当然你用数组我也不拦着),因为合并的方式很特殊,可以不管合并

Comet OJ - Contest #5

Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下,最大的满足条件的\(x\)不会太大 因为当\(x\)越来越大时\(f(x)\)的增长速度比\(x\)的增长速度慢得多 其实可以证明,最大的满足的\(x\)不会超过\(100\) 因为没有任何一个三位数的各位之和大于等于\(50\) 所以我们就直接预处理\(1-99\)所有的合法的 暴力枚举即可 其实

Comet OJ - Contest #10 B

Comet OJ - Contest #10 B 沉鱼落雁 思维题 题意 : 每个数字最多重复出现三次,有n给数字,让你尽可能的使得相同数字之间的最小距离尽可能大 思路 :分三种情况套路 设 a b c 分别代表出现 一次, 两次, 三次 数字的个数 所有元素至多出现一次,答案为 n,题目规定 所有元素至多出现两次, 例如 1 1 2,可以排列成 1 2 1,所以,答案为 1 例如 1 1 2 2 3,可以排列成 1 2 3 1 2,所有 答案为 2 思考后得出,应该尽可能的把 b 个出现两次的

Comet OJ - Contest #7 解题报告

传送门:https://www.cometoj.com/contest/52 A:签到题 题意:多次询问,每次询问给出一个值域区间[l,r],从这区间范围中选出两个整数(可重复),依次求出这俩数的“最大的最小公倍数”.“最小的最小公倍数”.“最大的最大公约数”.最小的最大公约数. 分析:(1)显然,当区间长度为1时,该问题的答案只能是区间中仅有的那个数. (2)当区间的长度大于1时,最大的最小公倍数,lcmmax =lcm(ar,ar-1) = ar * ar-1: 最小的最小公倍数,lcmmi

Comet OJ Contest #3

A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 #define N 510 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}

Comet OJ - Contest #13

第一次打这种比赛.还是有不少问题的,以后改吧. A题WA了两次罚了不少时. C写到一半发现只能过1,就先弃了. D一眼没看出来.第二眼看出来就是一个类似于复数的快速幂. 然后B切了. 最后切C,图中还重构了一次.还TLE了3发.浪费了大量时间. Tips: 1.A题FB基本上拿不到的,好好写1A就没事了. 2.先看一遍,大码题和数据结构放后面. 3.先开数论,就TM死刚数论.(这次要是切A之后直接刚D就有FB了) 4.别急,奖励拿不拿就那样吧. 下面是solution: A 签到题. #incl

Comet OJ - Contest #0

A:化成x-√n=y+z-√4yz的形式,则显然n是完全平方数时有无数组解,否则要求n=4yz,暴力枚举n的因数即可.注意判断根号下是否不小于0. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long

Comet OJ - Contest #1

A:随便怎么暴力. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 25 char getc(){char c=getchar();while (c!='.'&&c!='#') c=getchar();return c;} int gcd(int n,int m){return m==0?n:gcd(m,n%m);} int read() { int x=0,f=1;char