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 的相关文章

  • 每个用户/浏览器会话仅显示一次欢迎 div

    我只想为每个用户或会话显示一次欢迎 div 我知道有 Jquery 选项 由于我是jquery的新手 我自己无法解决这个问题 请帮忙 document ready function close welcome click function
  • 如何使用 XMLHttpRequest 传递 php 会话

    我遇到的问题是 我正在通过 XMLHttpRequest 从已设置会话 cookie 的页面调用服务器上的 php 脚本 问题是我的页面调用的脚本为每次调用创建一个新的 session id 并且不使用现有的 session id 来存储我
  • AttributeError:__enter__ 使用 with 语句 SqlAlchemy 会话

    我明白了AttributeError enter 当我尝试像这样使用 SQLAlchemy 会话时guide http docs sqlalchemy org en latest orm session basics html My cod
  • PHP 会话不工作

    我正在使用 wamp2 0 PHP 5 3 apache 2 2 11 但我的会话不存储数据 我有一个接受参数的页面 我想将其 简化版本 存储在会话中 所以当我来到 http www example com home php sessid
  • 使用 3.0 SDK 在 FB 墙上发布

    各位程序员大家好 我在使用新的 Facebook SDK 时遇到了困难 场景是 我使用片段 所以我按照以下步骤操作 为什么 Android Facebook 界面不支持 Fragments https stackoverflow com q
  • Symfony 3 跨子域共享 cookie?

    我想跨任何子域共享 cookie 这应该可以让我保留会话 我使用的是 Symfony 框架 3 0 版 我读到您应该设置以下内容 app config config yml session cookie domain localhost 我
  • 使用Rvest登录网站抓取时出现403错误

    我试图在需要登录的网站上抓取页面 但不断收到 403 错误 我已经修改了我网站的这两篇文章中的代码 使用rvest或httr登录网页上的非标准表单 https stackoverflow com questions 28418770 usi
  • 使用 Spring 处理会话 ID

    我正在尝试为 GWT 构建一个 Spring 服务器 您可以将其视为 Javascript AJAX 客户端 但我无法决定架构的某一点 Session应该如何创建和使用 显然最简单的方法是使用 HTTP 会话 cookie 等 看起来不错
  • Cookie 未设置或首次不起作用

    在每个页面上 我都设置了一个 cookie 来为与该会话对应的标题按钮着色 问题是 当我第一次在不同的部分打开页面时 cookie 仍然是旧的 彩色按钮也是如此 然后 如果我再次单击同一按钮 则 cookie 会被正确设置 为什么 这是我的
  • 如何为多处理池中的单个进程分配Python请求会话?

    考虑以下代码示例 import multiprocessing import requests session requests Session data to be processed def process arg do stuff w
  • 如何使用 Spring Security 和 Spring Session 从多个服务器获取相同的会话

    很抱歉我的英语还是不太好 请耐心等待 希望您能理解我的问题 我有两个网络服务器 每个网络应用程序都是相同的 Web 服务器共享一台 Redis 服务器 我使用 Spring Security 和 Spring Session 当我登录第一台
  • 检查用户是否登录ajax页面更改

    作为我正在构建的网络应用程序的一部分 我需要在用户更改页面时检查用户是否已登录 在普通的非ajax站点上 这很容易 因为我可以将PHP会话条件语句放在标头中 并且在每次页面更改时调用的标头将确定是否显示登录页面 但将其视为头文件仅在 aja
  • 创建持久的 php 登录 cookie 会话

    我试图让我的登录会话持续更长时间 这样人们就不会过早退出我的网站 例如 制作一篇博客文章并在提交时丢失 因为 php 的 cookie 过期了 理想情况下 我想给他们一个 2 小时的会话 他们不会注销 每次加载页面时都会刷新 下面的代码片段
  • 致命错误:无法在functions.php第25行中重新声明session_start()

    当我尝试让登录部分正常工作时遇到问题 我不断遇到的问题是 致命错误 无法在 public html login functions php 第 25 行重新声明 session start
  • 安全灵活的跨域会话

    我有一个问题希望你能帮忙解决 假设我在一家名为 Blammo 的假设公司工作 我们有一个名为 Log 的假设产品 我正在尝试建立一个系统 人们可以登录 logfromblammo com 并订购我们的一些产品 然后当他们准备好购买时 前往
  • NodeJS + Express + Mongo 会话存储

    我目前在尝试在 MongoDb 中存储会话时遇到了很大的麻烦 我尝试过express session mongo和connect mongodb 当我尝试加载登录页面时 两者都给出了相同的 500内部服务器错误 这让我觉得也许在某个地方与
  • 将 cookie 设置为在会话结束时过期? ASP.NET

    我很惊讶我找不到任何答案 如何将 cookie 中的 sessionid 设置为在会话结束时过期 当浏览器关闭或用户一段时间不活动时 我发现的两个解决方案是 httpcookie Expires HttpContext Current Se
  • PHP 会话中的数据错误

    我对网上商店进行了以下设置 当用户登录时 通过 AJAX 调用脚本 该脚本根据 SOAP Web 服务验证用户数据 并返回用户数据 当用户登录时 用户数据保存在 PHP 会话中 用户数据 仅通过 SOAP 检索 而不由商店存储 我使用默认的
  • 对过期会话进行休息调用:HTTP 401 响应导致浏览器显示登录窗口

    我编写了一个 HTML 5 应用程序 它使用 AngularJS 并与在 Tomcat 上运行的 Java REST 后端进行交互 我使用 Spring Security 来处理登录和安全性 当用户进入网站时 他将被转发到登录页面 该页面创
  • PassportJS - 自定义回调并将 Session 设置为 false

    是否可以使用自定义回调并禁用会话 在文档中 它显示了如何禁用会话和自定义回调 但如何组合它们 app get login function req res next passport authenticate local function

随机推荐

  • 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 且每个数小数点后恰好有