jzoj 2017.9.16 模拟赛
来源:互联网 发布:inpaint mac破解版 编辑:程序博客网 时间:2024/06/06 08:27
T1:
纸牌游戏:
Bessie拿了一副有2n张卡片的牌和她的朋友Elsie玩,牌上的数字编号为1- 2n ,并将其均分成两份,一份卡片给Bessie 和一份卡片给Elsie。
然后两人开始玩牌,一共进行n轮,在每一轮中,Bessie 和Elsie 都打一张卡,谁的牌大就得一分。
Bessie 可以预测Elsie 打牌顺序,并且尽可能的想赢取胜利。请确定Bessie可以赢得的最大点数。
1≤N≤50,000
题解:
枚举+贪心:
直接用一个桶记录bessie的牌是什么,elsie的牌是什么,然后枚举i,j
因为2*N最大是2*50000,即100000
所以最大枚举100000次,
因为bessie要赢更多的点数!所以我们要贪心:
即用大于elsie的牌j的牌i要满足在bessie的牌中大于j且最小
挺容易实现的
时间复杂度:O(N)
var a:Array [0..100001] of boolean; b:Array [0..100001] of boolean; i,j,x,n,ans:longint;begin readln(n); for i:=1 to n do begin readln(x); a[x]:=true; end; for i:=1 to 2*n do if not(a[i]) then b[i]:=true; i:=1; j:=1; ans:=0; while (i<=2*n) and (j<=2*n) do begin while (not(a[i])) and (i<2*n) do inc(i); while (not(b[j])) and (j<2*n) do inc(j); if (a[i]) and (b[j]) and (j>i) then begin inc(i); inc(j); inc(ans); end else inc(j); end; writeln(ans);end.
T2:
田忌赛马:
“一天,田忌决定跟他的马比赛跑步……”
赛前,田忌感到非常恐慌,因为他不知道究竟是他跑得快还是马跑得快。他希望比较自己的速度v1与马的速度v2,如果马的速度比他快,那么他就会很无耻地取消比赛……
30%的数据:0≤v1,v2≤2147483647;
100%的数据:0≤v1,v2≤10^32768-1。
题解:
因为位数关系 所以用字符串;
先比长度,长度相同比按字典序直接比大小,
因为字符串中数字字符的大小顺序就是0..9从小到大。
var s,t:ansistring; ls,lt:longint;begin readln(s); readln(t); ls:=length(s); lt:=length(t); if ls>lt then writeln('Yes') else if (ls=lt) and (s>t) then writeln('Yes') else writeln('No');end.
T3:
环:
有一个圆,1 ~ N共N个数在圆环上顺时针排列着。
现在给你a, b, c三个数,问a → b → c的顺序是顺时针还是逆时针。
如图,1 → 4 → 2的顺序是逆时针。
100%的数据:1 ≤ a, b, c ≤ N ≤ 10^9,保证a, b, c之间两两互不相等。
题解:
找规律:
这题不难发现
a –> b –> c 为 顺时针
①a < b那么b–>c必须要右转才能满足!
②a > b那么b–>c也必须要右转才能满足!
这2次右转,因为a–>b 指向的问题,
①要转上半圈
②要转下半圈
而逆时针同理,推推就知道了。
时间复杂度:O(1)
var n,a,b,c:longint;begin readln(n,a,b,c); if a>b then begin if (c>a) or (c<b) then writeln('0') else writeln('1'); end else begin if (c>b) or (c<a) then writeln('1') else writeln('0'); end;end.
T4:
愤怒的奶牛:
有 n 捆位于不同整数位置 X1,X2,… Xn 的干草。如果奶牛撞击位于 x 位置上的干草包,那么 x 位置上的干草就会被引爆,并且这个干草包爆炸的“爆炸半径”为 1,这意味着任何其他干草包在一个单位的距离内也被引爆。然后这些相邻的包子自身爆炸同事也会引爆它边上的干草,每个爆炸半径都为 2,所以这些爆炸可能会将另外相距最多 2 个距离的未爆炸的干草继续引爆。在下一个时间步骤中,这些包也会以引爆半径 3 来引爆其它干草。每增加一次连锁爆炸,那么引爆半径就增加 1.
你的任务就是确定奶牛应该撞击哪个干草包,最后能引爆最多的干草包。
1 ≤ n≤100
干草包的位置x(0≤x≤1000000000)
题解:
这题,不要去看他位置的大小,因为N那么小,可以枚举!
然后每次枚举撞一个草包x,模拟求出向左最多能爆到的数l,向右同理,求出r.
然后在N个里面找出大小在[l,r]之间的x,求出数量sum,在N次枚举中找max{sum},即ans
时间复杂度:O(N^2)
var a,b:Array [0..101] of longint; n,i,j,k,p,l,r,sum,ans:longint; p1,p2,d:boolean;begin readln(n); for i:=1 to n do readln(a[i]); for i:=1 to n do begin b:=a; p:=1; l:=a[i]; p1:=true; while p1 do begin p1:=false; k:=maxlongint; for j:=1 to n do if (b[j]<>-1) and (i<>j) then if (b[j]>=l-p) and (b[j]<=l) then begin if k>b[j] then k:=b[j]; b[j]:=-1; p1:=true; end; if k<>maxlongint then begin inc(p); l:=k; end; end; l:=l-p+1; b:=a; p:=1; r:=a[i]; p2:=true; while p2 do begin p2:=false; k:=-1; for j:=1 to n do if (b[j]<>-1) and (i<>j) then if (b[j]>=r) and (b[j]<=r+p) then begin if b[j]>k then k:=b[j]; b[j]:=-1; p2:=true; end; if k<>-1 then begin inc(p); r:=k; end; end; r:=r+p-1; sum:=0; for j:=1 to n do if (a[j]>=l) and (a[j]<=r) then inc(sum); if sum>ans then ans:=sum; end; writeln(ans);end.
- jzoj 2017.9.16 模拟赛
- jzoj 2017.9.23 模拟赛
- jzoj 2017.9.30 模拟赛
- jzoj 2017.10.05 模拟赛
- jzoj 2017.10.06 模拟赛
- jzoj 2017.10.07 模拟赛
- jzoj 2017.10.08 模拟赛
- [暑假集训] jzoj 2016.7.16 noip模拟赛B 总结
- jzoj 2016.11.27 gdkoi模拟赛 总结
- jzoj 模拟赛总结(2017.07.08)
- jzoj 模拟赛总结(2017.07.09)
- jzoj 模拟赛总结(2017.07.10)
- jzoj 模拟赛总结(2017.07.11)
- jzoj 模拟赛总结(2017.07.12)
- jzoj 模拟赛总结(2017.07.14)
- jzoj 模拟赛总结(2017.07.13)
- jzoj 模拟赛总结(2017.07.15)
- JZOJ NOIP2014模拟 8.12
- vimの分割窗口
- WCF初探(一)
- 大学生与研究生的关系——“砖”与“建筑”
- 同一函数多次定义同名静态变量问题
- 极大似然法详解
- jzoj 2017.9.16 模拟赛
- 2.21 只考加法的面试题后续1
- Integer类==与equals区别与使用
- 如何解决Windows10下安装Ubuntu16.04双系统后没有Ubuntu引导
- 新手必备的12款Asset Store插件
- 暗影精灵3开机黑屏解决方案
- Murmurhash介绍与实现
- 天天和树
- IO概要的学习