[Offer收割]编程练习赛9,10
题目1 : 闰秒
描述
计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差。为了弥补这种偏差,我们偶尔需要增加一个“闰秒”。
最近的一次闰秒增加发生在UTC时间2016年的最后一天。我们在2016年12月31日23时59分59秒和2017年1月1日0时0分0秒之间增加了这样一秒:2016年12月31日23时59分60秒,记作2016-12-31 23:59:60。
目前一共增加了27次闰秒,具体添加的时间见下表:
给出两个时间,请你判断在考虑闰秒的情况下,这两个时间间隔多少秒。
输入
两个时间各占一行,格式是yyyy-MM-dd HH:mm:ss,范围在1970-01-01 00:00:00至2017-03-12 23:59:59之间。保证第一个时间不晚于第二个时间。
输出
两个时间间隔多少秒。
- 样例输入
-
- 2016-12-31 23:59:59
- 2017-01-01 00:00:00
- 2016-12-31 23:59:59
- 样例输出
-
- 2
暴力模拟就好了,用ans[2]-ans[1]。
- #include <stdio.h>
- #include <cstring>
- #include <cmath>
- using namespace std;
- typedef long long ll;
- ll ans[];
- int Y[]= {,,,,,,,,,,,,}; //nor
- char c[][][]; // 0 y-m-d 1 h-mi-s
- int y[],m[],d[],h[],mi[],s[];
- int data[][];
- bool runnian(int a)
- {
- if((a%==&&a%!=)||a%==) return ;
- else return ;
- }
- void debug()
- {
- printf("%d %d %d**\n",y[],m[],d[]);
- printf("%d %d %d\n",h[],mi[],s[]);
- printf("%d %d %d\n",y[],m[],d[]);
- printf("%d %d %d\n",h[],mi[],s[]);
- }
- void init()
- {
- memset(ans,,sizeof(ans));
- memset(y,,sizeof(y));
- memset(m,,sizeof(m));
- memset(d,,sizeof(d));
- memset(h,,sizeof(h));
- memset(mi,,sizeof(mi));
- memset(s,,sizeof(s));
- data[][]=;
- data[][]=;
- for(int i=; i<=; i++) data[i][]=;
- for(int i=; i<=; i++) data[i][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- for(int i=; i<=; i++) data[i][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- data[][]=;
- }
- ll ansy=**;
- ll calnian(int y)
- {
- ll ans=;
- for(int i=; i<=y; i++) //年
- {
- ans+=ansy;
- if(runnian(i)) ans+=**;
- if(data[i][]) ans++;
- if(data[i][]) ans++;
- }
- return ans;
- }
- ll calyue(int y,int m)
- {
- ll ans=;
- for(int j=; j<=m; j++) //月
- {
- ans+=Y[j]***;
- if(j==&&runnian(y)) ans+=**; //闰年2月+一天
- if(j==&&data[y][]) ans++;//闰秒也要
- if(j==&&data[y][]) ans++;
- }
- return ans;
- }
- ll calday(int y,int m,int d)
- {
- int f=;
- ll ans=;
- if(runnian(y)&&m==) ans+=*;
- ans+=d**;
- if(m==&&data[y][]) ans++;
- return ans;
- }
- int main()
- {
- init();
- for(int i=; i<=; i++)
- scanf("%d-%d-%d %d:%d:%d",&y[i],&m[i],&d[i],&h[i],&mi[i],&s[i]);
- //debug();
- for(int x=; x<=; x++)
- {
- ans[x]+=calnian(y[x]-);
- ans[x]+=calyue(y[x],m[x]-);
- ans[x]+=calday(y[x],m[x],d[x]-);
- ans[x]+=h[x]*;
- ans[x]+=mi[x]*;
- ans[x]+=s[x];
- }
- printf("%lld\n",ans[]-ans[]);
- return ;
- }
题目2 : 水陆距离
描述
给定一个N x M的01矩阵,其中1表示陆地,0表示水域。对于每一个位置,求出它距离最近的水域的距离是多少。
矩阵中每个位置与它上下左右相邻的格子距离为1。
输入
第一行包含两个整数,N和M。
以下N行每行M个0或者1,代表地图。
数据保证至少有1块水域。
对于30%的数据,1 <= N, M <= 100
对于100%的数据,1 <= N, M <= 800
输出
输出N行,每行M个空格分隔的整数。每个整数表示该位置距离最近的水域的距离。
- 样例输入
-
- 4 4
- 0110
- 1111
- 1111
- 0110
- 4 4
- 样例输出
-
- 0 1 1 0
- 1 2 2 1
- 1 2 2 1
- 0 1 1 0
- 0 1 1 0
宽搜,只搜终点,搜过的点再加到队列里。
- #include <queue>
- #include <vector>
- #include <stdio.h>
- #include <iostream>
- #include <string.h>
- #include <stdlib.h>
- #include <algorithm>
- using namespace std;
- const int inf=0x3f3f3f3f;
- const int maxn=;
- int n,m;
- int dir[][]={{,},{,-},{,},{-,}};
- int vis[maxn][maxn];
- char str[maxn][maxn];
- int ans[maxn][maxn];
- struct point{
- int x,y;
- }sna[maxn*maxn];
- struct edge{
- int x,y,step;
- };
- queue<edge>que;
- void bfs(){
- edge c,ne;
- while(!que.empty()){
- c=que.front();que.pop();
- for(int i=;i<;i++){
- int xx=c.x+dir[i][];
- int yy=c.y+dir[i][];
- if(xx<||xx>n-||yy<||yy>m-||vis[xx][yy]==) continue;
- // ans[xx][yy]=c.step+1;
- ans[xx][yy]=c.step+;
- ne.x=xx;ne.y=yy;ne.step=c.step+;
- vis[ne.x][ne.y]=;
- que.push(ne);
- }
- }
- }
- int main(){
- while(scanf("%d%d",&n,&m)!=-){
- while(!que.empty()) que.pop();
- memset(vis,,sizeof(vis));
- for(int i=;i<n;i++) scanf("%s",str[i]);
- for(int i=;i<n;i++) for(int j=;j<m;j++) ans[i][j]=inf;
- for(int i=;i<n;i++){
- for(int j=;j<m;j++){
- if(str[i][j]==''){
- ans[i][j]=;vis[i][j]=;
- edge c;
- c.x=i;c.y=j;c.step=;
- que.push(c);
- }
- }
- }
- bfs();
- // for(int i=0;i<n;i++) for(int j=0;j<m;j++) ans[i][j]=min(ans[i][j],st[i][j]);
- for(int i=;i<n;i++){
- for(int j=;j<m;j++){
- if(j==m-) printf("%d\n",ans[i][j]);
- else printf("%d ",ans[i][j]);
- }
- }
- }
- return ;
- }
题目2 : 出勤记录II
描述
小Hi的算法课老师每次上课都会统计小Hi的出勤记录。迟到会被记录一个L,缺席会被记录一个A,按时上课会被记录一个O。
一学期结束,小Hi的出勤记录可以看成是一个只包含LAO的字符串,例如"OOOOLOOOLALLO……"。
如果小Hi整学期缺席不超过1次,并且没有连续3次迟到,小Hi的出勤记录就算合格。
现在给出字符串的长度N,小Hi想知道长度为N的出勤记录中,合格的记录总共有多少种。
例如长度为3的合格出勤记录有19种:OOO OOL OOA OLO OAO LOO AOO OLL OLA OAL LOL LOA AOL LLO LAO ALO LLA LAL ALL。
输入
一个整数N(1 <= N <= 100000)。
输出
长度为N的合格记录总数。由于结果可能很大,你只需输出结果模109+7的余数。
- 样例输入
-
- 3
- 样例输出
-
- 19
DP,一共6种状态。
012代表有A,0代表以A或O结尾,1代表以L结尾,2代表以LL结尾。
345代表无A,3代表以O结尾,4代表以L结尾,5代表以LL结尾。
而6代表总数。
转移一下就好了,转移方程见代码。
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- typedef long long ll;
- const ll mod=1e9+;
- ll dp[][];
- int main()
- {
- int n;
- memset(dp,,sizeof(dp));
- dp[][]=;
- dp[][]=;dp[][]=dp[][]=dp[][]=;
- dp[][]=;dp[][]=;dp[][]=;
- for(int i=;i<=;i++)
- {
- dp[i][]=(dp[i-][]+dp[i-][]+dp[i-][]+
- dp[i-][]+dp[i-][]+dp[i-][])%mod;
- dp[i][]=dp[i-][]%mod;
- dp[i][]=dp[i-][]%mod;
- dp[i][]=(dp[i-][]+dp[i-][]+dp[i-][])%mod;
- dp[i][]=dp[i-][]%mod;
- dp[i][]=dp[i-][]%mod;
- dp[i][]=(dp[i][]+dp[i][]+dp[i][]+
- dp[i][]+dp[i][]+dp[i][])%mod;
- }
- while(scanf("%d",&n)!=EOF)
- printf("%lld\n",dp[n][]);
- return ;
- }
[Offer收割]编程练习赛9,10的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- hihocoder offer收割编程练习赛10 C 区间价值
思路: 令v[l, r](0<= l <= r < n)表示区间[l,r]的价值,则长度为n的区间的价值最少为0,最多为n*(n-1)/2.整体对价值二分,求能满足sum{v[l, ...
- 【[Offer收割]编程练习赛10 C】区间价值
[题目链接]:http://hihocoder.com/problemset/problem/1483 [题意] 中文题 [题解] 二分最后的答案; 二分的时候; 对于每一个枚举的值x; 计算小于等于 ...
- 【[Offer收割]编程练习赛10 B】出勤记录II
[题目链接]:http://hihocoder.com/problemset/problem/1482 [题意] [题解] 递推题. 每次增加3个字符中的一个;然后根据下面这个数组递推; 递推方式看程 ...
- HihoCoder1670 : 比赛日程安排([Offer收割]编程练习赛41)(模拟)
描述 H国编程联赛中有N只队伍,编号1~N. 他们计划在2018年一共进行M场一(队)对一(队)的比赛. 为了让参赛队员能得到充分的休息,联赛组委会决定:每支队伍连续两场比赛之间至少间隔一天.也就是如 ...
- [Offer收割]编程练习赛48
题目1 : 折线中点 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一条折线. 请你求出这条折线的 ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
随机推荐
- ADOTable的CancelUpdate和CancelBatch的区别?(100分)
出差新疆,修改别人的代码,请教CancelUpdate和CancelBatch的区别! 如果希望取消对当前记录所做的任何更改或者放弃新添加的记录,则必须调用CancelUpdate 方法CancelB ...
- Delphi 导出数据至Excel的7种方法【转】
一; delphi 快速导出excel uses ComObj,clipbrd; function ToExcel(sfilename:string; ADOQuery:TADOQuery): ...
- windows下 navicat_premium破解方法
https://blog.csdn.net/qq_21205435/article/details/78902052
- 优步加入Linux基金会:支持开源
导读 当地时间11月16日,优步在Uber Open Summit 2018年度峰会上宣布加入Linux基金会,并作为金级会员坚定支持对开源工具的使用和贡献. 优步CEO Thuan Pham将Lin ...
- BZOJ3724 PA2014Final Krolestwo(欧拉回路+构造)
如果没有长度为偶数的限制,新建一个点向所有奇点连边,跑欧拉回路即可,显然此时一定存在欧拉回路,因为所有点度数都为偶数. 考虑长度为偶数的限制,将每个点拆成两个点放进一个二分图里,那么每条原图中的边在二 ...
- BZOJ3589 动态树(树链剖分+容斥原理)
显然容斥后转化为求树链的交.这个题非常良心的保证了查询的路径都是到祖先的,求交就很休闲了. #include<iostream> #include<cstdio> #inclu ...
- gym 101064 G.The Declaration of Independence (主席树)
题目链接: 题意: n个操作,有两种操作: E p c 在序号为p的队列尾部插入c得到新的队列,序号为i D p 查询并删除序号为p的队列顶部的元素,得到序号为i的新队列 思路: 需要查询 ...
- day25 初始面向对象
类 有具体规范,无具体值对象 有具体的值 dict 类d = {"":""} 对象 自定义一个类格式: class 类名: # 可以跟()或者不跟 属性 = ' ...
- 学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator
前言 主要是完成微服务的监控,完成监控治理.可以查看微服务间的数据处理和调用,当它们之间出现了异常,就可以快速定位到出现问题的地方. springboot - version: 2.0 正文 依赖 m ...
- [USACO 2018 December Contest]作业总结
t1 Convention 题目大意 每一头牛都有一个来的时间,一共有\(n\)辆车,求出等待时间最长的那头牛等待的最小时间. 解法 第一眼看到这道题还以为是\(2018noip\)普及组的t3魔鬼题 ...