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身体大大小,但是众所周知,古代人的算数水平都比较差,聪明的你能帮助他解决问题吗?
输入描述:
一行。两个数x和y,分别表示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; }
太
题目描述:
残存的碎片却愈加清晰。
好久一段时间,记忆突然停顿了,脑子一片空白。
忘记此刻是何年何月,甚至忘记自己是谁,等待太久,一切都回不到最初的原点。
九年。
相遇,分离,重逢,再…… 从初始到末端。
如傻瓜般虔诚的追随在你左右。
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; }
妃
题目描述:
回忆的章节错乱不堪,想要收拾那些画面用来重温,却显得七零八乱。
整个人是麻木的,记忆也跟着苍白。
曾留下太多太深的足迹在心里。
刻意隐瞒,隐藏,隐忍着……
用近乎笨拙的方式隐身荒芜的背后,一直在原地徘徊。
决绝的用极端的方式否定了一切的伤痕和不舍, 清楚的听见自己心碎的声音。
一次次对灵魂华丽的自残,壮观而且荒谬。
我想我还是做错了,一味强求,不想离开你。
众所周知,三校区有一项优雅的大课间活动——广场舞。广场舞在以前是十分好跳的,同学们只要随着音乐翩翩起舞即可。但是三区校长为了增加广场舞的趣味性和可观性,勒令同学们摞成一摞跳操。同学们碍于各班班长的淫威只得同意了,同学们在跳操时是这样纸的,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; }
思路:
奶牛们从起点出发然后在回到起点,也就是说奶牛走过的路径为一个环,在奶牛走的这个环中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; }
以上是关于9.15模拟试题的主要内容,如果未能解决你的问题,请参考以下文章