论<<我是如何被一步步逼向深渊的>>
查看原帖
论<<我是如何被一步步逼向深渊的>>
939830
JunYao0楼主2023/11/7 17:47

拿到题目,心想不就是一道找贪心排列吗?粗略证明之后,枚举几个例子感觉可以了,然后直接交了一发。90分,卡在了#10。我开始摒弃一点跳脱,又仔细地扫了一遍代码,彼时的我笃定卡在了边界上,意图从一个大臣的情况下找到错误,但我不知道这是之后为我更进一步的走向深渊的伏笔。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n;
struct node
{
    int a, b;
    bool operator<(const node& c)const
    {
        return a * b <c.a * c.b;
    }
}c[1007];
int ans[5007],l[5007];
int cnt = 0;
void turn(int x)
{
    while (x)
    {
        l[++cnt] = x % 10;
        x /= 10;
    }
}
void gaojing(int x)
{
    int len = cnt + 4;
    for (int i=1;i<=len;i++)l[i] *= x;
    int k = 0;
    for (int i=1;i<=len;i++)
    {
        l[i] += k;
        k = l[i] / 10;
        l[i] %= 10;
    }
    while (len > 1 && l[len] == 0)len--;
    cnt = len;
}
void gjc(int x)
{
    int len = cnt;
    int r = 0;
    for (int i=len;i>=1;i--)
    {
        int tmp = l[i] + r * 10;
        ans[i] = tmp / x;
        r = tmp % x;
    }
    while (len > 1 && ans[len] == 0)len--;
    cnt = len;
}
int main()
{
    cin >> n;
    int a, b; cin >> a >> b;
    turn(a);
    for (int i=1;i<=n;i++)scanf("%d%d",&c[i].a, &c[i].b);
    sort(c+1,c+1+n);
    //for (int i = 1; i <= n; i++)
    //{
    //    printf("%d %d %d\n",i,c[i].a,c[i].b);
    //}
    for (int i=1;i<=n-1;i++)
    {
        gaojing(c[i].a);
    }
    /*for (int i = cnt; i >= 1; i--)
    {
        printf("%d", l[i]);
    }*/
    gjc(c[n].b);
    for (int i=cnt;i>=1;i--)
    {
        printf("%d",ans[i]);
    }

    return 0;
}

我百思不得其解,我看到下载数据点这一选项,犹疑不定地最终还是选择了下载,我想要看看这能卡住我的并且让我苦寻不得的数据到底是什么?我马上要解开她的面纱了,但当我看到数据点,我傻眼了。

当n=1000的时候,她,她居然输入了100000个大臣的a,b值。 我懵逼了,这样的数据,像一把锋利的刻刀,撕裂了我的幻想和憧憬。 我苦思冥想也想不明白为什么n=1000的时候居然能输入100000个大臣,我崩溃了,我进入讨论版疯狂地寻找与我同病相怜的可怜之人,也许我看到了,但我没看到一个解释。 当我进入厕所的时候,我脑海里划过一道闪电,窗外万里晴空,却仿佛暴雨雷鸣。我突然想到当前面的大臣和国王左手a全为1,那么此时似乎排序的最后一位大臣得到的值在我的代码之下变成了0,但事实上,第二位大臣是可以获得一枚金币的,也就是说,在此刻的情形下,我证明的贪心策略不攻自破,也就是说只要特判即可。

我欣然至极并理所当然地敲下

if(!ans[cnt]1)printf("1");

我认为我AC在握了,我在acwing先行提交。哼,果然AC了。于是我自信满满的回到洛谷,交上了我这份满分的答卷,然而现实再一次击垮了我。居然倒在了#11,倒在了这个我之前就AC的而现在挂掉的平平无奇的数据点上!我难以置信并嚎啕大哭,我无法说明这究竟是怎样的悲哀和困顿。我只能重装旗鼓,再次进入debug环节,彼时的我绝望乃至愤怒。我直接就点击了下载数据点,然后我明白了。原来当大臣数目只有1个的时候,上面那种特判的情况又需要改变,因为只有1个,那么答案就只能是0了。 于是我修改了特判为

if (!ans[cnt] && n > 1)printf("1");
    else if (!ans[cnt] && n == 1)printf("0");

这一次我胆战心惊并小心翼翼地提交了我的代码,仿佛倾注了全力,终于我得到了满屏开花的AC特效。我如释重负,但又心有不安,因为我始终没明白当n=1000的时候,为什么会有十万个大臣的输入。 我怀着重重的心事,敲下了这篇帖子,希望告诫后人并且等待答案。

2023/11/7 17:47
加载中...