NOIP2017提高组玩挂

话说比赛时的电脑调试,有恶心的问题,第一次输出中间结果好恶心。差点把我调吐了。

DAY1

第一题 小凯的疑惑

题目描述

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。

这道题是我挂的最惨的一道题之一,我当时首先把问题变成了(ax+by)n!=n,(x,y为非负整数),然后我们知道对于所有的ax+by=1一定有解(a,b互质),但是x和y有可能为负数,我们不妨把式子变成 a(xn+bk)+b(yn-ak)=n;如果xn+bk和yn-ak不可以同时为正那么n就是一个解。所以(xn+bk)(yn-ak)<0,很明显满足这个条件的n∈[-bk/x,ak/y],那么我们要求的n就是当k取所有整数时都没有在区间里的数,而且我们发现随着k的增大单个区间的范围也在变大,因此当一个区间的范围达到起始点可以在上一个区间的结束点前面时,就绝对没有解了,那么这个区间的上一个整数位置就是答案。但是好像写丑了,原因不明(好像卡精度了)。

这个是我考试时的代码(爆0)是的,你没看错,就是I64d!!

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double EPS=0.0000001;
long long exgcd(long long a,long long b,long long &x,long long &y)
{
    if(b==0)
    {
        x=1,y=0;
        return a;
    }
    long long xx,yy;
    long long d=exgcd(b,a%b,xx,yy);
    x=yy;
    y=xx-(a/b*yy);
    return d;
}
void sp(double &a,double &b)
{
    double t;
    t=a;
    a=b;
    b=t;
}
long long a,b;
int main()
{
    freopen("math.in","r",stdin);
    freopen("math.out","w",stdout);
    scanf("%I64d %I64d",&a,&b);
    long long k1,k2;
    exgcd(a,b,k1,k2);
    //printf("%I64d %I64d %I64d %I64d\n",a,b,k1,k2);
    double  kx=-(double(b)/double(k1)),ky=(double(a)/double(k2));
    //printf("%.3lf %.3lf\n",kx,ky);
    if(kx<0)
        kx=-kx,ky=-ky;
    if(kx>ky)
        sp(kx,ky);
    double ab=ky-kx;
    double n=kx/(ab);
    double lx=n*kx,nx=n*kx,ny=n*ky;
    //printf("%.3lf %.3lf\n",lx,ny);
    for(long long x=(long long)(n);x>=1;x--)
    {
        nx=nx-kx;
        ny=ny-ky;
        if((long long)(ny+EPS)+1<(long long)(double((long long)(lx))==lx?(long long)(lx):((long long)(lx)+1)))
        {
            printf("%I64d\n",(long long)(ny)+1);
            fclose(stdin);
            fclose(stdout);
            return 0;
        }
        lx=nx;
    }
    printf("0\n");
    fclose(stdin);
    fclose(stdout);
}

然额,考试的绝大多数同学是通过打表找规律做的,他们发现有个公式:ab-a-b,论打表的优越性,然后他们过了。。。。

第二题 时间复杂度

题目描述

小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是否正确。

考试时忘了判断F i n n为O(1)的情况,炸完。。。。。

第三题 逛公园

题目描述

策策同学特别喜欢逛公园。公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边。其中1号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间。
策策每天都会去逛公园,他总是从1号点进去,从NN号点出来。
策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间。如果1号点 到NN号点的最短路长为dd,那么策策只会喜欢长度不超过d + Kd+K的路线。
策策同学想知道总共有多少条满足条件的路线,你能帮帮它吗?
为避免输出过大,答案对PP取模。
如果有无穷多条合法的路线,请输出−1。

前面的调试把我恶心了3h,最后半个小时这道题写了一个DJ,准备骗30,但是忘了有零环毕竟只读了2分钟题 然后day1就此炸完。

DAY2

在带着第一天炸完的心情到了第二天。

第4题 奶酪

题目描述

现有一块大奶酪,它的高度为 hh,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞。我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为z = 0z=0,奶酪的上表面为z = hz=h。
现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在的坐 标。如果两个空洞相切或是相交,则 Jerry 可以从其中一个空洞跑到另一个空洞,特别 地,如果一个空洞与下表面相切或是相交,Jerry 则可以从奶酪下表面跑进空洞;如果 一个空洞与上表面相切或是相交,Jerry 则可以从空洞跑到奶酪上表面。
位于奶酪下表面的 Jerry 想知道,在 不破坏奶酪 的情况下,能否利用已有的空洞跑 到奶酪的上表面去?

直接BFS就搞定的事。为啥不放在Day1?

第5题 宝藏

题目描述

参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的 m 条道路和它们的长度。
小明决心亲自前往挖掘所有宝藏屋中的宝藏。但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多。
小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定。
在此基础上,小明还需要考虑如何开凿宝藏屋之间的道路。已经开凿出的道路可以 任意通行不消耗代价。每开凿出一条新道路,小明就会与考古队一起挖掘出由该条道路 所能到达的宝藏屋的宝藏。另外,小明不想开发无用道路,即两个已经被挖掘过的宝藏 屋之间的道路无需再开发。
新开发一条道路的代价是:

L×K

L代表这条道路的长度,K代表从赞助商帮你打通的宝藏屋到这条道路起点的宝藏屋所经过的 宝藏屋的数量(包括赞助商帮你打通的宝藏屋和这条道路起点的宝藏屋) 。
请你编写程序为小明选定由赞助商打通的宝藏屋和之后开凿的道路,使得工程总代 价最小,并输出这个最小值。

第一眼感觉是最小生成树,但是很快自我否定了之后,就写了BFS准备骗40,但是luogu测出来只有10分,懵逼。

第5题 宝藏

题目描述

Sylvia 是一个热爱学习的女孩子。
前段时间,Sylvia 参加了学校的军训。众所周知,军训的时候需要站方阵。
Sylvia 所在的方阵中有n×m名学生,方阵的行数为 nn,列数为 mm。
为了便于管理,教官在训练开始时,按照从前到后,从左到右的顺序给方阵中 的学生从 1 到 n \times mn×m 编上了号码(参见后面的样例)。即:初始时,第 ii 行第 jj 列 的学生的编号是(i-1)\times m + j(i−1)×m+j。
然而在练习方阵的时候,经常会有学生因为各种各样的事情需要离队。在一天 中,一共发生了 q q件这样的离队事件。每一次离队事件可以用数对(x,y) (1≤x≤n,1≤y≤m)描述,表示第 xx 行第 yy 列的学生离队。
在有学生离队后,队伍中出现了一个空位。为了队伍的整齐,教官会依次下达 这样的两条指令:
向左看齐。这时第一列保持不动,所有学生向左填补空缺。不难发现在这条 指令之后,空位在第 xx 行第 mm 列。
向前看齐。这时第一行保持不动,所有学生向前填补空缺。不难发现在这条 指令之后,空位在第 nn 行第 mm 列。
教官规定不能有两个或更多学生同时离队。即在前一个离队的学生归队之后, 下一个学生才能离队。因此在每一个离队的学生要归队时,队伍中有且仅有第 nn 行 第 mm 列一个空位,这时这个学生会自然地填补到这个位置。
因为站方阵真的很无聊,所以 Sylvia 想要计算每一次离队事件中,离队的同学 的编号是多少。
注意:每一个同学的编号不会随着离队事件的发生而改变,在发生离队事件后 方阵中同学的编号可能是乱序的。

考试一看发现更改的是半行半列后就写了树状数组,每次更改后就把影响的部分加上1或m,结果写完后发现要炸空间,就改成了map,就在这时突然发现,消失的人被放在了最后面,然后就爆力查找是否之前有请过假,结果写了个比爆力还慢的东西;最终在luogu上面爆0了;

Day3

may the force of other be with you;

~~end

猜你喜欢

转载自blog.csdn.net/qq_35713030/article/details/78519313
今日推荐