APIO 2018 Practice Session T1 Wedding cake

2023-05-16

          • 没有传送门
          • 题目大意
          • 思路
          • 参考代码
          • 熟悉环境

没有传送门
题目大意

给你一个长度为 n n 的正整数序列 ai,要求构造出 n n 个小数,使得它们的和为 1,且每个数小数点后恰好有 ai a i 位(当然要去除多余的零啦!)。要求你构造出来,或者宣判无解。

思路

唉,我太弱了,看来凉了。到目前为止,我断断续续地做了大约 5 5 个小时,只做了 T1。T2 猜了个结论打了个暴力,T3 暴力都打不来,唉,我太弱啦!

我也不知道这是不是正解,反正卡过咯(刚过就被退出登录,还以为见鬼了,原来是恰好命题组更新了 A 题(A + B Problem)QAQ),可能我只会做 A 题吧。连 A + B 问题我都交了 4 次,唉,我太弱啦!

我的想法是考虑从小到大构造。一个很直接的想法是:先把数构造得尽量小,不够再拿一些数来补嘛。先考虑特殊情况。显然只有一个数的时候是无解的。显然,如果所有数都取理论最小值( 0.001 0.00 ⋯ 1 )时都超过了 1 1 也是无解的。我们立刻得到一个解决子任务 2 的算法:我们看 n n 的值。若 (n1)10,显然我们可以让 (n1) ( n − 1 ) 个数变成 0.001 0.00 ⋯ 1 ,让最后一个数补足至 1 1 。这最后一个数的结尾肯定不是 0,符合题意。若 (n1)10 ( n − 1 ) ∣ 10 ,如果还像这样做肯定就炸了,解决方法很简单:让前面的某一个数变成 0.002 0.00 ⋯ 2 ,问题就解决了,顺利得到 21 21 分。

但是我太弱了,为了理解题意,我用类似的方法去构造样例数据,结果没过,用计算器一算发现加起来等于 0.9 0.9 ,唉,这都算错了,我太弱啦!

根据经验,做题有两个突破口:一是用合理的方法解决小数据规模的问题,二是用合理的方法解决 Special Instance。现在我们解决了 Special Instance,我们看看能不能扩展到一般情况。拿样例来看,我们立刻得到一个思路:将数按长度分类,每类按长度排序。我们将长的那一类想办法凑齐至短的那一类的 0.001 0.00 ⋯ 1 的形式,则得到一个 Special Instance 的子问题,问题就解决了。但是显然不会这么简单,因为有可能短的那一类很多,导致超过了恰好比它长的那一位,怎么办呢?

当然是乱搞啊!我们将多的那个看成是对上一位的贡献,如果还有多的,贡献继续累加到再上一位就是了(不要问我在说什么,我太弱了,说不清楚)。另外,这会导致需要凑齐的数从 1 1 变成 k,用解决子任务 2 2 类似的方法,写个高精度减法就好了。如果算到最后超出了 1,那么问题无解。因为这种填充方法是贪心地使每个数填最小的,所以这么判断无解是对的。

需要注意的是判断超出 1 1 的方法,不仅要记录商,还要记录余数,原因显然,但是像我这么弱的人,写都写晕了(你把上面的思路看懂算我输),哪里还知道写的什么?于是又贡献了两发。总共提交了 15 次,离限制的 50 50 次还差很多,应该没什么问题吧。(毕竟我这么弱,根本没有恒心一道题交这么多次,卡常时除外

参考代码
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <cctype>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <functional>
typedef long long LL;
typedef unsigned long long ULL;
using std::cin;
using std::cout;
using std::endl;
typedef int INT_PUT;
INT_PUT readIn()
{
    INT_PUT a = 0; bool positive = true;
    char ch = getchar();
    while (!(ch == '-' || std::isdigit(ch))) ch = getchar();
    if (ch == '-') { positive = false; ch = getchar(); }
    while (std::isdigit(ch)) { a = a * 10 - (ch - '0'); ch = getchar(); }
    return positive ? -a : a;
}
void printOut(INT_PUT x)
{
    char buffer[20]; int length = 0;
    if (x < 0) putchar('-'); else x = -x;
    do buffer[length++] = -(x % 10) + '0'; while (x /= 10);
    do putchar(buffer[--length]); while (length);
}

const char yes[] = "YES", no[] = "NO";
const int maxn = int(1e5) + 5;
int n;
int a[maxn];
int sum, t1 = true;

int buf[maxn];

#define RunInstance(x) delete new x
struct work
{
    std::vector<std::pair<int, int> > vec;

    static void printPre2(int digit)
    {
        printOut(0);
        putchar('.');
        for (int i = 1; i <= digit; i++)
            printOut(0);
    }
    static void printPre(int digit)
    {
        for (int i = 1; i <= digit; i++)
            printOut(0);
    }

    std::vector<std::vector<int> > remain;
    int idx[maxn];
    bool need2[maxn];

    work() : need2()
    {
        memset(buf, 0, sizeof(buf));
        for (int i = 1; i <= n; i++)
            buf[a[i]]++;

        for (int i = 1; i < maxn; i++)
            if (buf[i])
            {
                vec.push_back(std::make_pair(i, buf[i]));
                idx[i] = vec.size() - 1;
            }
        if (vec.back().second == 1)
        {
            puts(no);
            return;
        }

        remain.resize(vec.size());

        int contri = 0;
        for (int i = vec.size() - 1; ~i; i--)
        {
            int temp = contri + vec[i].second;
            bool mod = false;
            for (int j = vec[i].first; temp && j > (i ? vec[i - 1].first : 0); j--)
            {
                mod |= (bool)(temp % 10);
                temp /= 10;
            }
            if (!i && temp && mod)
            {
                puts(no);
                return;
            }
            remain[i].resize(vec[i].first - (i ? vec[i - 1].first : 0) + 1);
            remain[i].back() = temp + mod;
            while (remain[i].back() > 10)
            {
                remain[i].push_back(remain[i].back() / 10);
                remain[i][remain[i].size() - 2] %= 10;
            }

            int t = contri;
            int cnt = 0;
            while (t)
            {
                remain[i][cnt] -= t % 10;
                t /= 10;
                cnt++;
            }
            for (int j = 0; j < remain[i].size() - 1; j++)
                if (remain[i][j] < 0)
                {
                    remain[i][j] += 10;
                    remain[i][j + 1]--;
                }
            contri = temp + mod;

            if (vec[i].second == 1 && !remain[i][0])
            {
                puts(no);
                return;
            }

            int sub = vec[i].second - 1;
            if (sub % 10 == remain[i][0])
            {
                sub++;
                need2[vec[i].first] = true;
            }
            t = sub;
            cnt = 0;
            while (t)
            {
                remain[i][cnt] -= t % 10;
                t /= 10;
                cnt++;
            }
            for (int j = 0; j < remain[i].size() - 1; j++)
                if (remain[i][j] < 0)
                {
                    remain[i][j] += 10;
                    remain[i][j + 1]--;
                }
            while (!remain[i].back())
                remain[i].pop_back();
        }

        puts(yes);
        for (int i = 1; i <= n; i++)
        {
            buf[a[i]]--;
            if (need2[a[i]])
            {
                need2[a[i]] = false;
                printPre2(a[i] - 1);
                printOut(2);
                putchar('\n');
            }
            else if (buf[a[i]])
            {
                printPre2(a[i] - 1);
                printOut(1);
                putchar('\n');
            }
            else
            {
                const std::vector<int>& v = remain[idx[a[i]]];
                printPre2(a[i] - v.size());
                for (int i = v.size() - 1; ~i; i--)
                    printOut(v[i]);
                putchar('\n');
            }
        }
    }
};

void run()
{
    n = readIn();

    if (n == 1) // 一个肯定不行
    {
        puts(no);
        return;
    }

    for (int i = 1; i <= n; i++)
    {
        sum += a[i] = readIn();
        if (i > 1 && a[i] != a[i - 1]) t1 = false;
    }

    for (int i = 1; i <= n; i++)
        buf[a[i]]++;
    for (int i = n; i; i--)
    {
        buf[i - 1] += buf[i] / 10;
        buf[i] %= 10;
    }
    bool bOk = false;
    for (int i = 1; i <= n; i++)
        if (buf[i])
        {
            bOk = true;
            break;
        }
    if ((buf[0] && bOk) || buf[0] > 1) // 都选最小还比 1 大也不行
    {
        puts(no);
        return;
    }

    RunInstance(work);
}

int main()
{
#ifdef LOCAL
    freopen("C.in", "r", stdin);
#endif
    run();
    return 0;
}
熟悉环境

感觉 Guide 还是挺不错的,除了那个神奇的在 Linux 下的代码补全,其它的地方都超过了记事本。我本来以为不能调字体,结果可以,在类似于调语法高亮的颜色那里。我本来以为不能加编译选项,结果可以,在文件选项卡那里点击右键就可以了(还是每个文件一份配置,真是天地良心)。可惜的是没有好看的字体,不等宽简直闪瞎眼。

为什么只能按 Tab 统一缩进一格,不能按 Shift + Tab 统一取消缩进一格?可能是个 bug 吧……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

APIO 2018 Practice Session T1 Wedding cake 的相关文章

  • Roslyn,通过 hostObject 传递值

    我正在尝试通过 hostObject 发送一个类 但显然它不想工作 using Roslyn Compilers using Roslyn Compilers CSharp using Roslyn Scripting using Rosl
  • 测试 CodeIgniter 会话变量的正确方法是什么?

    获取以下代码片段 测试确保会话变量不为空的最佳方法是什么 如果稍后在我的脚本中 我调用以下内容 第一个打印正确 但在第二个我收到消息 未定义的变量 已登录 我尝试过使用 empty and isset 但两者均未成功 我还尝试使用向后执行
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • asp.net cookie、身份验证和会话超时

    我有一个使用表单身份验证的 asp net 网站 我在会话中保留一些信息 例如用户名 用户 ID 电子邮件等 我通过在身份验证 cookie 上设置较长的到期日期来允许用户保持登录网站的状态 因此 当用户仍处于身份验证状态时 会话过期的情况
  • 适用于移动应用程序的 Rails REST API。会议

    我正在创建一个移动应用程序 该应用程序拥有用户并与后端的自定义 Rails REST API 进行通信 我应该在登录时创建会话吗 或者我应该在每个请求中发送用户名和密码 如果会议是可行的方法 那么通常是如何实施的 只需生成令牌 并使用它们来
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 当请求来自网络服务器而不是网络浏览器时,HTTPSession 的创建如何工作?

    我有一个非常基本的问题 HTTPSession 的创建是如何工作的 我知道你们会因为我把这个问题视为类似的问题而解雇我 存在问题 但是我问这个问题是有原因的 我知道 httpsession 是 Web 浏览器所独有的 当我们第一次执行 Ht
  • 在带有 RequestScope 的 ManagedBean 中使用有状态 EJB 时出现问题

    我在 Glassfish v3 应用程序服务器中使用 JSF 2 0 和 EJB 3 1 我实际上面临以下问题 在带有 RequestScope 的 MengedBean 中 我想访问一个会话对象 带有 Stateful 的 EJB 它应该
  • Spring 在 AuthenticationSuccessHandler 中自动装配会话范围 bean 不起作用

    我正在使用 spring security 我想初始化一个对象User在用户成功登录后的会话中 安全配置如下 Configuration EnableWebSecurity PropertySource classpath configs
  • NodeJS 超级测试对会话对象的访问

    我正在使用 supertest 测试我的 Node js 应用程序 在我的控制器中 我访问会话对象 为了发出有效的请求 该会话对象需要填充一些数据 控制器 determine whether it is user s own profile
  • Rails 会话间歇性重置

    我知道这个主题已经被讨论了很多 但我相信我已经找到了它的一个新变体 我有一个 Rails 4 应用程序 它是从 Rails 3 升级的 并且具有rails ujs and csrf meta tags设置正确 一旦root url在浏览器中
  • PDO 静默准备失败[重复]

    这个问题在这里已经有答案了 我正在尝试 PHPsession set save handler我想使用 PDO 连接来存储会话数据 我有这个函数作为写入操作的回调 function write id data logger WRITE id
  • Rails 和 Authlogic:每个用户只允许一个会话?

    有没有办法限制 Ruby on Rails 应用程序中的会话数量 我使用 Authlogic 进行身份验证 我希望每个用户帐户只允许 1 个会话 当同一用户登录另一台计算机时 先前的会话应该过期 失效 我正在考虑将会话数据存储在数据库中 然
  • 会话在选项卡之间共享

    我有 JAVA Web 应用程序 我需要停止在浏览器选项卡之间共享会话 这意味着 用户打开浏览器 登录其帐户并在同一浏览器的新选项卡中打开特定页面 根据默认设置 会话将共享到新选项卡 并且用户会自动登录到新选项卡 谁能告诉我如何阻止这种情况
  • 从自定义设置会话文件夹中删除旧会话文件?

    使用 PHP 如果我设置自定义会话文件夹来存储会话文件 我必须做什么才能确保旧会话文件最终被删除 有没有办法让 Apache 或 PHP 为我处理这个问题 或者我需要设置一些东西来自己清理这个文件夹 非常感谢有关此主题的任何信息 我目前正在
  • session_regenerate_id(true) ajax 请求或快速刷新时的无效会话

    为了避免会话固定 我在每个 PHP 页面的开头使用以下代码 session set cookie params 900 domain 1 1 session start session regenerate id true 但如果页面刷新太
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • NHibernate、数据绑定到 DataGridView、延迟加载和会话管理 - 需要建议

    我的主应用程序窗体 WinForms 有一个 DataGridView 它使用 DataBinding 和 Fluent NHibernate 显示 SQLite 数据库中的数据 该表单在应用程序运行的整个过程中都是打开的 出于性能原因 我
  • 负载平衡集群中的 PHP 会话 - 如何?

    好的 我得到了这个完全罕见的负载平衡 PHP 网站的独特场景 令人遗憾的是 它过去没有进行负载平衡 现在我们开始遇到问题 目前唯一的问题是 PHP 会话 当然 一开始没有人想到这个问题 因此 PHP 会话配置保留为默认值 因此 两台服务器都
  • 如何在使用 Web 服务时获取会话对象?

    如何在使用 Web 服务时获取会话对象 服务在两个程序之间调用 如何在使用 Web 服务时获取用户会话对象 不可能使用请求对象获取会话 因为当我们谈论服务时不会有请求或响应 如果您正在与JAX WS https jax ws dev jav

随机推荐

  • UOJ 2016 [APIO 2016] Gap

    传送门思路参考代码交互题 交互题大致形式Windows 平台下 xff08 Dev C 43 43 xff09 Ubuntu 平台下 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 题也做不来 这道题简直就是利用
  • CF 940F Machine Learning

    传送门题目大意思路参考代码Remarks 传送门 题目大意 给你一个数组 a 1 n n 10 5 a 1 n
  • CF 976D Degree Set

    传送门题目大意思路参考代码总结 传送门 题目大意 给你一个长度为 n n 的正整数序列 d 1 d 2 d n d1 d2 dn xff08 d 1 lt d 2 lt lt d n
  • Luogu 3778 [APIO 2017] 商旅

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 看到这道题就想到了二分答案找负环 xff0c 但是怎么做呢 xff1f 完全不会 唉 xff0c 我太弱啦 xff01 先注意题目中说可以重复经过点和边 x
  • CF 963E Circles of Waiting

    传送门题目大意思路参考代码 传送门 题目大意 在平面直角坐标系上 xff0c 有一个神奇的点 xff0c 一开始在 0 0 0 0 每秒钟这个点都会随机移动 xff1a 如果它在 x y
  • CF 976F Minimal k-covering

    传送门题目大意 输入格式输出格式 思路参考代码 传送门 题目大意 给你一张二分图 G 61 U V E G 61 U V
  • CF 963A Alternating Sum

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易做得来一道题 xff0c 还是 A 题 xff08 所以不要瞧不起 A 题 xff09 xff0c 结果还写错了 xff08 不知道为什
  • iOS中瀑布流布局详解

    前段时间在逛淘宝的时候发现淘宝的商品界面的布局是瀑布流 我记得明明之前不是瀑布流的 x1f611 刚好手上活忙完了 xff0c 写了一个瀑布流的布局 xff0c 简单的封装了下 xff0c 以便日后使用 x1f60f 其实说到底瀑布流也就是
  • Luogu 2146 [NOI 2015] 软件包管理器

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 好不容易遇到一道傻逼题 xff0c 又出了个傻逼错误 xff0c 爆得只剩 30 30 分了 唉 xff0c 我太弱啦 xff01 显然 xff
  • Luogu 2150 [NOI 2015] 寿司晚宴

    传送门思路对于 30 30 30 的数据对于 100 100 100 的数据参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 完全做不来 xff0c 连暴力都打不来 主要好像是因为我从来没有做过以质因子为
  • Luogu 3649 [APIO 2014] 回文串

    传送门思路Manacher 算法 特殊字符回文半径算法与实现本质不同的回文串个数 正解参考代码总结 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 这道题各路神仙都说是模板题 xff0c 但我觉得完全不可做 xf
  • Luogu 2168 [NOI 2015] 荷马史诗

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 连哈夫曼树都不会 这道题就是一个 k k 叉哈夫曼树 题目要求满足两个条件 一是代价最小 二是最长长度最小 最长长度最小很好解决 只需要优先合并
  • Luogu 2178 [NOI 2015] 品酒大会

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 做了两个星期的题 xff0c 自己做出来的才只有这一道 xff0c 唉 xff0c 我太弱啦 xff01 我们考虑第一问怎么做 题目中相似的概念
  • Luogu 1117 [NOI 2016] 优秀的拆分

    传送门思路利用后缀数组解决重复子串问题注意事项参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 连暴力都想不到 xff0c 唉 xff0c 我太弱啦 xff01 考虑暴力法 xff0c 可以枚举一个中间点
  • Luogu 1712 [NOI 2016] 区间

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 这么个傻逼题 xff0c 居然把离散化写错了 xff0c 唉 xff0c 我太弱啦 xff01 显然我们可以考虑枚举最短长度和最长长度 xff0
  • CF 977F Consecutive Subsequence

    传送门思路参考代码 传送门 思路 CF 的第一场 div3 xff0c 在我提交了一份有错的代码后突然不能提交了 xff0c 在跑什么 System Testing xff0c 我就跟它杠上了 xff0c 直到它评测完 唉 xff0c 我太
  • CF 7D Palindrome Degree

    传送门思路参考代码 传送门 思路 不是马拉车加随便 DP 乱搞 xff1f 本来想复习一下马拉车的 xff0c 结果拉出了许多事端 xff08 修复了 OI Learner Judge 的严重 bug 一个害我调了两节课的 bug xff0
  • Luogu 3822 [NOI 2017] 整数

    传送门思路参考代码 传送门 思路 唉 xff0c 我太弱了 xff0c 什么都不会 xff0c 当年网同这道题还拿了 16 16 分 xff0c 现在一分都不会做了 xff0c 唉 xff0c 我太弱啦 xff01 这道题其实是很不错的 x
  • 【Go】go语言中切片的长度变化后容量的变化

    一 新增信息长度 43 当前长度 lt 61 当前容量 span class token keyword func span span class token function printSlice span span class toke
  • APIO 2018 Practice Session T1 Wedding cake

    没有传送门题目大意思路参考代码熟悉环境 没有传送门 题目大意 给你一个长度为 n n 的正整数序列 a i ai xff0c 要求构造出 n n 个小数 使得它们的和为 1 1 xff0c 且每个数小数点后恰好有