9.15模拟试题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了9.15模拟试题相关的知识,希望对你有一定的参考价值。

                     模拟考试套题

                                                                                                                            gryz信息组专场

题目名称

最初的最初

可执行文件名

eat

hwc

dance

sugar

输入文件

eat.in

hwc.in

dance.in

sugar.in

输出文件

eat.out

hwc.out

dance.out

sugra.out

时间限制

1s

0.2s

1s

0.5s

是否有部分分

满分

1000

100

100

100

空间限制

128M

128M

128M

128M

测试点数量

20

20

20

20

测试点分值

50

5

5

5

数据是否分层

 

不要相信出题人

注意事项:

1. 文件名(输入和输出文件名) 必须是英文小写。

2. 若无说明,对比方式均为忽略行末空格及文末回车的全文比较。

3. C/C++中函数 main()的返回值必须是 int,程序正常结束的返回

值必须是 0

4. 评测环境为 cena 注意:windows long long 输入输出请使用%I64d

5. 编译时不打开任何优化选项。

6.本套题目不保证没有任何彩蛋。

另:题目难度与题目顺序无关!

 

 

 

 

 

 

 

 

 

最初的最初

题目描述:

思绪,漂浮,荒乱,不知去向。

那些记忆,凌乱的,盘旋于脑海,迟迟不肯离去。

以为,时间会带走一切,我拼命的拒绝着你虚假演绎的片段。

想忘记,忘记。

 

当一切又回到最初的最初,杂乱而又不知所措。hkd望着远处苍茫迷蒙的混沌,陷入了久久的沉思。忽而,一把巨斧划过天际,盘古破开了混沌,hkd也在之混沌破灭之际被巨斧斩断,身体一分为二,化为了两件先天至宝,随盘古一起落入了洪荒之中。

后来,鸿钧成圣,捡到了两件先天至宝------hkd的身体,他想要知道混沌魔神hkd身体大大小,但是众所周知,古代人的算数水平都比较差,聪明的你能帮助他解决问题吗?

输入描述:

一行。两个数xy,分别表示hkd两段身体的大小。

输出描述:

一行,hkd身体的大小。

样例输入:

4  7

样例输出:

11

提示:

x<=100000000;

y<=100000000;

 

 

 防AK好题、、(自己好好做做、、、、)

技术分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long 
using namespace std;
ll x,y,ans;
ll read()
{
    ll x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
int main()
{
    freopen("eat.in","r",stdin);
    freopen("eat.out","w",stdout);
    x=read(),y=read();
    ans=x+y;
    printf("%I64d",ans);
    return 0;
}
AC‘代码

 

 

题目描述:

残存的碎片却愈加清晰。

好久一段时间,记忆突然停顿了,脑子一片空白。

忘记此刻是何年何月,甚至忘记自己是谁,等待太久,一切都回不到最初的原点。

九年。

相遇,分离,重逢,再…… 从初始到末端。

如傻瓜般虔诚的追随在你左右。

 

2333年,在银河系的某星球上,X军团和Y军团正在激烈地作战。在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai。当一个巨型机器人的装甲值减少到0或者以下时,这个巨型机器人就被摧毁了。X军团有M个激光武器,其中第i个激光武器每秒可以削减一个巨型机器人Bi的装甲值。激光武器的攻击是连续的。这种激光武器非常奇怪,一个激光武器只能攻击一些特定的敌人。Y军团看到自己的巨型机器人被X军团一个一个消灭,他们急需下达更多的指令。

输入描述:

一行 给你一个数n 表示下达的指令。

输出描述:

一行 请输出第n个回文数

样例输入:

输入样例#1:

2333

输出样例#1:

1334331

样例输出:

输入样例#2:

12345678987654321

输出样例#2:

23456789876543222234567898765432

提示:

对于 10%的数据 n<=100

对于 20%的数据 n<=100000000

对于 100%的数据 n<=1000000000000000000

 

 打表找规律

先打一个表

回文数的位数                     回文数的个数
1位 1 2 3 4 5 6 7 8 9   9
2位 11 22 33 44 55 66 77 88 99   9
3位 101 111 121 131 141 151 161 171 181 191  
  202 212 222 232 242 252 262 272 282 292  
  。。。                    
  909 919 929 939 949 959 969 979 989 999 90
4位 1001 1111 1221 1331 1441 1551 1661 1771 1881 1991  
  、、、                    
  9009 9119 9229 9339 9449 9559 9669 9779 9889 9999 90
5位 10001 10101 10201 10301 10401 10501 10601 10701 10801 10901 9*10*10=900
6位 100001 、、、                 9*10*10=900

 

我们可以发现这样一个规律1位跟2位的回文数有9个,3位跟4位的有90个,5位跟6位的有900个,7位跟8位的有9000个,9位跟10位的有90000个

我们预处理出来到达每一位的回文数的个数,求一个前缀和,然后处理出来当前要求的第几个回文数是几位的数。也就是回文数的长度。

然后我们将回文数拆成两半来进行分析,我们可以发现后一半是讲前一半对称过去的,并且影响回文数的大小(编号)的只与前面一半有关。

我们处理出来回文数的长度以后在看看他在当前长度里是第几个数,我们可以发现,这个数的前一半的大小正好等于他是当前长度里的第几个数-1+当前长度的第一个数。我们可以发现当长度为1的时候第一个数是从1开始的,为2的时候第一个数是从1开始的,为3从10开始,4从10开始,5从100开始、、、以此类推,我们又会发现一个规律,长度为n的数的前半段的第一个数是从10^((l+1)/2)开始的。那么前一半的数的大小就是(10^((l+1)/2))+n-f[l-1]+1然后在根据长度的奇偶就可以知道后半段的数的大小。

技术分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long 
#define N 1000000000000000000LL
using namespace std;
ll n,s,f[1100],l,len,x;
ll read()
{
    ll x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
ll qpow(ll n,ll k)
{
    ll res=1;
    while(k)
    {
        if(k&1) res=res*n;
        n=n*n;
        k=k>>1;
    }
    return res;
}
int main()
{
    freopen("hwc.in","r",stdin);
    freopen("hwc.out","w",stdout);
    n=read(); s=9;
    for(int i=1;;s*=10)
    {
        f[i]=f[i-1]+s; i++;
        f[i]=f[i-1]+s; i++;
        if(f[i-1]>=N) break;
    }
    for(int i=1;i<=n;i++)
     if(n<=f[i])
     {
         l=i;
         break;
         
     }
    len=l;
    n-=f[l-1];l=(l+1)/2;
    x=qpow(10,l-1)+n-1;
    printf("%I64d",x);
    if(len%2!=0) x/=10;
    while(x)
    {
        printf("%I64d",x%10);
        x/=10;
    }
    return 0;
}
AC代码

 

 

 

题目描述:

回忆的章节错乱不堪,想要收拾那些画面用来重温,却显得七零八乱。

整个人是麻木的,记忆也跟着苍白。

曾留下太多太深的足迹在心里。

刻意隐瞒,隐藏,隐忍着……

用近乎笨拙的方式隐身荒芜的背后,一直在原地徘徊。

决绝的用极端的方式否定了一切的伤痕和不舍, 清楚的听见自己心碎的声音。

一次次对灵魂华丽的自残,壮观而且荒谬。

我想我还是做错了,一味强求,不想离开你。

众所周知,三校区有一项优雅的大课间活动——广场舞。广场舞在以前是十分好跳的,同学们只要随着音乐翩翩起舞即可。但是三区校长为了增加广场舞的趣味性和可观性,勒令同学们摞成一摞跳操。同学们碍于各班班长的淫威只得同意了,同学们在跳操时是这样纸的,30个人摞成一摞(因为学校人数太少了,(*^__^*) ),摞成了n摞:

 

校长会偷偷的窝在小黑屋里,放各种颜色的烟花来指挥跳舞。校长最多可以燃放30个烟花,烟花有四种颜色,分别可以指挥所有的同学向东,西,南,北各移动一个格。但是这样跳操太累了,同学们都想偷懒,当一摞同学最下面的同学移动到教学楼时,这摞同学最上面的学生会跳到教学楼顶层,如下图:

 

同学们想要尽可能多的偷懒,于是找到了你,总校后勤烟花爆竹管制处处长。

因为校长的烟花都是由你提供的,而校长只会按照你提供的烟花的顺序去燃放烟花,请你给出最多可以有几名同学偷懒,和此时燃放烟花的顺序。顺序用E,W,S,N表示指挥东西南北各种不同颜色的烟花。若有多个相同的,输出字典序最小的。

输入描述:

1行3个整数n,m,k,描述同学摞成了几摞,教学楼的个数,校长可燃放的烟花的个数。

2到1+n行每行两个整数x,y,描述n摞同学开始时的坐标。

n+2到n+m+1行每行两个整数x,y,描述m个教学楼的坐标。

输出描述:

两行。

第一行 :最多能偷懒的学生的个数。

第二行 :此时燃放烟花的方案。

样例输入:

3 6 3

3 4

6 2

5 7

8 2

9 2

6 4

5 4

6 7

8 7

样例输出:

6

EEE

提示:

10%的数据,n<=1000,m<=1000,k<=5

40%的数据,n<=1000,m<=1000,k<=10

70%的数据,n<=1000;m<=1000;k<=20

100%的数据,n<=1000,m<=1000,k<=30,0<=x<=10000,0<=y<=10000

 

 

 

 

 

 

 

 

 

 

 

题目描述:

还是忘不了。

关于你的好与不好。

分分合合,早已成为习惯。

偏执的如同我的性格般执拗。

什么事都不做,安静的蜷缩在被窝里,细数自己的心碎与莫落。

最初的最初。

最后的最后。

 

Xxy每天都奋斗在跳楼梯的第一线,所以回宿舍后感到又累又饿,很快陷入了梦乡。在梦中,xxy进入了一个巨大的城堡。

Xxy惊讶的发现,这座城堡有n个房间和m条走廊,走廊非常窄,只能单向通行。Xxy惊讶的发现在每个房间里都有一个魔法阵,魔法阵可以召唤魔法糖果,每个房间有且只有一个魔法糖果。每个魔法糖果都有一个饱腹值,xxy吃下糖果,就会增加饱腹值,不那么饿。与吃糖果相反的是,xxy需要穿越走廊才能吃到糖果,而每个走廊又有一定的疲惫值。Xxy想在吃完糖果后返回出发点。

Xxy现在非常的饥饿,所以她想吃到尽量多的糖果。但是,xxy也非常的累,所以她不想去浪费时间走更多的路。所以xxy希望在平均单位时间里,获得的饱腹值尽可能的大。请问xxy能得到的最大平均饱腹值是几?(因为xxy太饿了,所以他至少要吃掉2颗糖果)                                                                  

输入描述:

第一行:输入n,m,分别表示城堡中房间的数量,和走廊的数量。

第二行:输入n个数f,表示从1到n号房间内,每个房间里糖果能提供的饱腹值。

接下来m行,每行输入三个数x,y,z,表示房间x与y之间有走廊相连通。走完这条走廊的疲惫之为z。

输出描述:

一行,一个数ans表示xxy能得到的最大平均饱腹值,结果保留两位小数

样例输入:

5 7

30

10

10

5

10

1 2 3

2 3 2

3 4 5

3 5 2

4 5 5

5 1 3

5 2 2

样例输出:

6.00

提示:

对于100%数据:2≤n≤1000,2≤m≤5000,1≤x,y≤n,1≤f,z≤1000。

 

洛谷原题

https://www.luogu.org/problem/show?pid=2868

 

在洛谷上好好地70分被出题人卡成了5分(啊啊啊,全部超时!)

技术分享
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 51000
using namespace std;
bool vis[N];
int n,m,x,y,z,tot;
int c[N],num[N],head[N];
double ans,mid,l,r,w[N],dis[N];
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
struct Edge
{
    int next,to,from,dis;
}edge[N];
int add(int x,int y,int z)
{
    tot++;
    edge[tot].to=y;
    edge[tot].dis=z;
    edge[tot].next=head[x];
    head[x]=tot;
}
int spfa(int s)
{
    queue<int>q;
    memset(vis,0,sizeof(vis));
    memset(num,0,sizeof(num));
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0,vis[s]=true; q.push(s);
    while(!q.empty())
    {
        x=q.front(),q.pop();vis[x]=false;
        for(int i=head[x];i;i=edge[i].next)
        {
            int t=edge[i].to;
            if(dis[t]>dis[x]+w[i])
            {
                dis[t]=dis[x]+w[i];
                if(!vis[t])
                {
                    vis[t]=true;
                    q.push(t);
                    num[t]++;
                    if(num[t]>n) return true;
                }
            }
        }
    }
    return false;
}
int pd()
{
    for(int i=1;i<=n;i++)
     if(spfa(i)) return true;
    return false;
}
int main()
{
    freopen("sugar.in","r",stdin);
    freopen("sugra.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=n;i++) c[i]=read();
    for(int i=1;i<=m;i++)
    {
        x=read(),y=read(),z=read();
        add(x,y,z);
    }
    l=0,r=1000000;
    while(r-l>0.00000001)
    {
        mid=(l+r)/2;
        for(int i=1;i<=tot;i++)
        {
            int t=edge[i].to;
            w[i]=(double)mid*edge[i].dis-c[t];
        }
        if(pd())
        {
            ans=mid;
            l=mid;
        }
        else r=mid;
    }
    printf("%.2lf",ans);
    return 0;
}
bfs的spfa(洛谷70)

 

思路:

奶牛们从起点出发然后在回到起点,也就是说奶牛走过的路径为一个环,在奶牛走的这个环中ans=所有的乐趣数/路上消耗的所有的时间。

我们将上面的式子进行变形,可以得到路上消耗的所有时间*ans=所有的乐趣数。——>路上消耗的所有时间*ans-所有的乐趣数=0;

然后我们在进行二分答案,处理出ans,然后对于每一个ans跑n个spfa,判断是否存在负环,如果存在负环就说明当前方案不是最佳答案(存在负环条件:当前点入队次数大于n,当然这种情况是当我们用bfs的spfa时),让我们用dfs的spfa时,我们用一个bool变量表示这个数有没有被访问过,如果被访问过,说明他出现了负环直接结束循环。我们的ans还能有更大的解,即当路上消耗的所有的时间*ans-所有的乐趣数<0时我们的ans不是当前最优解继续更新最优解

注意:二分结束的条件为r-l>0.000001,否则会爆long long

 当然你会发现我们会TLE既然这样我们就写dfs的spfa判负环,在这之前我有一篇博客讲过这种写法http://www.cnblogs.com/z360/p/6883351.html

 

技术分享
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 51000
using namespace std;
bool vis[N];
int n,m,x,y,z,tot;
int c[N],num[N],head[N];
double ans,mid,l,r,w[N],dis[N];
struct Edge
{
    int to,dis,from,next;
}edge[N];
int add(int x,int y,int z)
{
    tot++;
    edge[tot].to=y;
    edge[tot].dis=z;
    edge[tot].next=head[x];
    head[x]=tot;
}
int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();}
    while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();}
    return x*f;
}
int spfa(int x)
{
    vis[x]=true;
    for(int i=head[x];i;i=edge[i].next)
    {
        int t=edge[i].to;
        if(dis[t]>dis[x]+w[i])
        {
            dis[t]=dis[x]+w[i];
            if(vis[t]||spfa(t))
            {
                vis[x]=false;
                return true;
            }  
        }
    }
    vis[x]=false;
    return false;
}
int pd()
{
    for(int i=1;i<=n;i++)
        if(spfa(i)) return true;
    return false;
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++) c[i]=read();
    for(int i=1;i<=m;i++)
    {
        x=read(),y=read(),z=read();
        add(x,y,z);
    }
    l=0,r=100005;
    while(r-l>0.0000001)
    {
        mid=(l+r)/2;
        for(int i=1;i<=tot;i++)
        {
            int t=edge[i].to;
            w[i]=(double)mid*edge[i].dis-c[t];
        }
        if(pd())
        {
            ans=mid;
            l=mid;
        }
        else r=mid;
    }
    printf("%.2lf",ans);
    return 0;
}
dfs AC代码

 

 

以上是关于9.15模拟试题的主要内容,如果未能解决你的问题,请参考以下文章

9.15noip模拟赛总结

NOIP2016提高A组模拟9.15Osu

NOIP2016提高A组模拟9.15Math

NOIP2016提高A组模拟中秋节9.15总结

9.15上课日记

片段(Java) | 机试题+算法思路+考点+代码解析 2023