解题报告(第5周)韩
POJ2790解题报告

POJ2790解题报告2790:迷宫描述⼀天Extense在森林⾥探险的时候不⼩⼼⾛⼊了⼀个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表⽰可以通⾏后者表⽰不能通⾏。
同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个⽅向之⼀的相邻格点上,Extense想要从点A⾛到点B,问在不⾛出迷宫的情况下能不能办到。
如果起点或者终点有⼀个不能通⾏(为#),则看成⽆法办到。
输⼊第1⾏是测试数据的组数k,后⾯跟着k组输⼊。
每组测试数据的第1⾏是⼀个正整数n (1 <= n <= 100),表⽰迷宫的规模是n * n 的。
接下来是⼀个n * n的矩阵,矩阵中的元素为.或者#。
再接下来⼀⾏是4个整数ha, la, hb, lb,描述A 处在第ha⾏, 第la列,B 处在第hb⾏, 第lb列。
注意到ha, la, hb, lb全部是从0开始计数的。
输出k⾏,每⾏输出对应⼀个输⼊。
能办到则输出“YES”,否则输出“NO”。
解题思路:利⽤深度优先的⽅法找到第⼀个可⾏的路径具体步骤:1、使⽤⼀个栈来寄存待回溯访问的结点;2、判断⾸结点是否满⾜条件,若满⾜则⼊栈,若否则直接返回;3、试探下⼀个可以访问的结点(满⾜可访问且没有重复访问过);4、若存在可以访问的结点:4.1、访问第⼀个可以访问的结点;4.2、访问时,将结点⼊栈并标记,以便判断重复访问性;4.3、对访问的结点考察步骤3;5、若不存在可以访问的结点:5.1、退栈,然后对栈顶结点考察步骤3;6、当退栈⾄⾸结点,且⽆法继续访问时,返回结果NO;7、当访问到⽬标结点时,返回结果YES。
C++代码:#include#include#include#ifndef MAX#define MAX 101using namespace std;class cor{public:int x;int y;};int main(){stack path;cor node{0,0};int k;cin >> k;for ( int i = 0 ; i < k ; i++ ){int n;cin >> n;char maze[MAX][MAX];for ( int i = 0; i < n; i++ ){for ( int j = 0; j < n; j++ ){cin >> maze[i][j];}}int ha, la, hb, lb;cin >> ha >> la >> hb >> lb; node.x = ha;node.y = la;path.push(node);bool flag = false;while( true ){if (maze[node.x][node.y] == '#')break;}if (node.x == hb && node.y == lb){flag = true;cout <<"YES"<break;}//to leftif (node.x - 1 >= 0 && maze[ node.x - 1 ][node.y] == '.') {node.x--;maze[node.x][node.y] = '$';path.push(node);continue;}//to rightif (node.x + 1 < n && maze[ node.x + 1 ][node.y] == '.') {node.x++;maze[node.x][node.y] = '$';path.push(node);continue;}//to upif (node.y - 1 >= 0 && maze[node.x][ node.y - 1 ] == '.') {node.y--;maze[node.x][node.y] = '$';path.push(node);continue;}//to downif (node.y + 1 < n && maze[node.x][ node.y + 1 ] == '.')node.y++;maze[node.x][node.y] = '$'; path.push(node); continue;}path.pop();if (path.empty()){break;}node = path.top();}if (!flag)cout << "NO" << endl;}return 0;}。
NOIP (1)-2021-解题报告

全国信息学奥林匹克联赛(NOIP2021)复赛提高组—解题报告NOIP 2013 解题报告BY DOVECL提高组 day1题目概况1.转圈游戏(circle.cpp/c/pas)【问题描述】n 个小伙伴(编号从0 到n-1)围坐一圈玩游戏。
按照顺时针方向给n 个位置编号,从0 到n-1。
最初,第0 号小伙伴在第0 号位置,第1 号小伙伴在第1 号位置,……,依此类推。
游戏规则如下:每一轮第0 号位置上的小伙伴顺时针走到第m 号位置,第1 号位置小伙伴走到第m+1 号位置,……,依此类推,第n − m 号位置上的小伙伴走到第0 号位置,第n-m+1 号位置上的小伙伴走到第1 号位置,……,第n-1 号位置上的小伙伴顺时针走到第m-1 号位置。
现在,一共进行了10k 轮,请问x 号小伙伴最后走到了第几号位置。
【输入】输入文件名为circle.in。
输入共1 行,包含4 个整数n、m、k、x,每两个整数之间用一个空格隔开。
【输出】输出文件名为circle.out。
输出共1 行,包含1 个整数,表示10k 轮后x 号小伙伴所在的位置编号。
【输入输出样例】对于30%的数据,0 < k < 7;对于80%的数据,0 < k < 107;对于100%的数据,1 < n < 1,000,000,0 < m < n,1 ≤ x ≤ n,0 < k < 109。
【分析】对于本题,不难推出,所求解即为(m 10 k+x) mod n然而对于 k≤109,显然暴力求解是不行的,有很大的超时风险大概有两种做法:1、求出循环节,然后用 k mod 循环节长度即可(长度必然不会超过 n)2、使用快速幂算法,以下程序将使用快速幂求解【代码】#include <cstdio>typedef long long LL;int m,n,k,x;LL qmul(int p,int k){LL temp=p,s=1;while(k!=0){if(k%2==1)s=(s*(temp%n))%n;temp=(temp*temp)%n;k=k/2;}return s;}int main(){freopen("circle.in","r",stdin);freopen("circle.out","w",stdout);scanf("%d%d%d%d",&n,&m,&k,&x);printf("%I64d",(m*qmul(10,k)+x)%n);return 0;}【问题描述】2.火柴排队(match.cpp/c/pas)涵涵有两盒火柴,每盒装有n 根火柴,每根火柴都有一个高度。
oj解题报告

1129 1130 1136 1137 1140 1141 1144 1145
资源分配 DP,很明显的两种转移方式,全是同性别和差值不超过限制. 经典合并类 DP, 贪心,先按开始点排序,然后尽量取向后远的点. 先按高度排序,然后从比 I 高的所有点转移过来,前提是该点与 I 有路径,需高精度 贪心,将能走到的加油站放进集合中,从中选取最大的来进行加油,保证最大距离也就保证了最小加油次数 二分答案加贪心,对于该题,注意的地方就是,从最后的人贪心和保证每人都有工作. 对字符串进行排序,但是排序是比较左右交换相加大小. 贪心,对于 A[I]<B[I]进行以 A[I]为关键字的升序排列,对于 A[I]>=B[I]进行以 B[I]为关键字的降序排列, 为了让第二个人没时间休息,在第一阶段第一个人做的工作越短越好,在第二阶段第二个人做的工作越长越好.
1123
F[i]表示前 I 个建立起来的最低高度,那么就有一个很明显的 DP 过程,枚举 J 让 J-I 这一段重新建层以获得最低 高度.
1124 1126
合并类 DP,对于题目理解,要加以个 N+1 的点表示总长,将题目权值计算倒过来理解. 资源分配 DP,F[I,J]表示前 I 朵花第 I 朵放在 j 位置的最大权值. F[I,j]=max{f[i-1,k]+v[I,j]}(1<=i<=n,i<=j<=m-n+I;i-1<=k<=j-1)
1034 1035 1037 1038 1040 1042
背包,背重量 背包,背 MOD 后的值 二分求最长下降或上升序列 同上 预处理出地区的陨石落点的时间,然后做 BFS 找到没有陨石掉落地点 A*,这里的 A*处理的是 F(x)为 BFS 1-x 的权值加上 x-n 的最短路,不过有个小细节,关于有向图的 SPFA 预处理 要反向建边,然后正向建边做估价 BFS
小H的聚会解题报告

NOI2005《小H的聚会》解题报告【任务描述】小H从小就非常喜欢计算机,上了中学以后,他更是迷上了计算机编程。
经过多年的不懈努力,小H 幸运的被选入信息学竞赛省队,就要去他日思夜想的河南郑州参加第22届全国信息学奥林匹克竞赛(NOI2005)。
小H的好朋友小Y和小Z得知了这个消息,都由衷的为他感到高兴。
他们准备举办一个party,邀请小H和他的所有朋友参加,为小H庆祝一下。
经过好几天的调查,小Y和小Z列出了一个小H所有好友的名单,上面一共有N 个人(方便起见,我们将他们编号为1至N 的整数)。
然而名单上的人实在是太多了,而且其中不少人小Y 和小Z 并不认识。
如何把他们都组织起来参加聚会呢?小Y 和小Z 希望为小H 的N 个好友设计一张联系的网络,这样,若某个人 得知了关于聚会的最新情况,则其他人都可以直接或间接得到消息。
同时为了尽 量的保证消息传递得简单、高效以及最重要的一点:保密(为了给小H 一个惊 喜,在party 的筹备阶段这个聚会的消息是绝对不能让他知道的),小Y 和小Z 决定让尽量少的好友直接联系:为了保证N个好友都能互相直接或间接联系到, 只需要让(N-1)对好友直接联系就可以了。
显然,名单上的好友也不都互相认识,而即使是两个互相认识的人,他们之间的熟悉程度也是有区别的。
因此小Y 和小Z 又根据调查的结果,列出了一个好友间的关系表,表中标明了哪些人是可以直接联系的,而对于每一对可以互相联系的好友,小Y 和小Z 又为他们标出了联系的愉快程度。
如3 和4 的关系非常好,因此标记他们之间的联系愉快程度为10;而1 和3 是一般的朋友,则他们的愉快程度要小一些。
上面的图1 表示一个N=5 的联系表,其中点表示名单上的好友,边则表示两个好友可以直接联系,边上的数字即为他们联系的愉快程度。
小Y和小Z希望大家都能喜欢这次聚会,因此决定在尽量最大化联系网络的愉快程度:所谓联系网络的愉快程度,即每一对直接联系人之间的愉快程度之和。
高三数学每日1题(第五周)

星期一(数列) 2023年____月____日【题目1】 (2021·福州质检)在①S n =2a n +1,②a 1=-1,log 2(a n a n +1)=2n -1,③a 2n +1=a n a n +2,S 2=-3,a 3=-4这三个条件中任选一个,补充在下面问题的横线上,并解答.问题:已知单调数列{a n }的前n 项和为S n ,且满足________. (1)求{a n }的通项公式. (2)求数列{-na n }的前n 项和T n .(注:如果选择多个条件分别解答,那么按第一个解答计分.) 解 (1)选①,即S n =2a n +1,(ⅰ) 则当n =1时,S 1=2a 1+1,a 1=-1; 当n ≥2时,S n -1=2a n -1+1.(ⅱ) (ⅰ)(ⅱ)两式相减,化简得a n =2a n -1, 所以{a n }为等比数列,其公比为2,首项为-1. 所以a n =-2n -1.选②,即a 1=-1,log 2(a n a n +1)=2n -1. 所以当n ≥2时,log 2(a n a n +1)-log 2(a n -1a n )=2, 即a n +1a n -1=4, 所以{a 2k -1}(k ∈N *)为等比数列,其中首项为a 1=-1,公比为4, 所以a 2k -1=-1×4k -1=-2(2k-1)-1.由a 1=-1,log 2(a 1a 2)=1,得a 2=-2, 同理可得,a 2k =-2×4k -1=-22k -1(k ∈N *). 综上,数列{a n }的通项公式为a n =-2n -1. 选③,即a 2n +1=a n a n +2,S 2=-3,a 3=-4, 所以{a n }为等比数列,设其公比为q ,则⎩⎨⎧a 1(1+q )=-3,a 1q 2=-4,解得⎩⎨⎧a 1=-1,q =2,或⎩⎪⎨⎪⎧a 1=-9,q =-23.又因为{a n }为单调数列,所以q >0,故⎩⎨⎧a 1=-1,q =2,所以a n =-2n -1.(2)由(1)知,-na n =n ·2n -1,所以T n =1+2×2+3×22+…+(n -1)·2n -2+n ·2n -1, 2T n =2+2×22+…+(n -2)·2n -2+(n -1)·2n -1+n ·2n ,两式相减,得-T n =1+2+22+…+2n -2+2n -1-n ·2n =(2n -1)-n ·2n , 所以T n =(n -1)·2n +1.星期二(三角) 2022年____月____日【题目2】 (2021·南京、盐城一模)在△ABC 中,角A ,B ,C 的对边分别为a ,b ,c ,A =B +3C .(1)求sin C 的取值范围; (2)若c =6b ,求sin C 的值.解 (1)由A =B +3C 及A +B +C =π得2B +4C =π, ∴B =π2-2C ,∴A =π2+C .由⎩⎨⎧0<A <π,0<B <π,0<C <π,即⎩⎪⎨⎪⎧0<π2+C <π,0<π2-2C <π,0<C <π,得0<C <π4,故sin C 的取值范围为⎝ ⎛⎭⎪⎫0,22.(2)若c =6b ,则由正弦定理得sin C =6sin B ,① 由(1)知B =π2-2C ,则sin B =sin ⎝ ⎛⎭⎪⎫π2-2C =cos 2C ,②由①②得16sin C =cos 2C =1-2sin 2 C ,∴12sin 2 C +sin C -6=0, 解得sin C =23或sin C =-34. 又sin C ∈⎝⎛⎭⎪⎫0,22,∴sin C =23.星期三(概率与统计) 2022年____月____日【题目3】 2019年12月27日,国家统计局公布全国规模以上工业企业月累计营业收入利润率数据如下表: 月份累计 1~2月 1~3月 1~4月 1~5月 1~6月 1~7月 1~8月 1~9月 1~10月 1~11月月份累计代码x 1 2 3 4 5 6 7 8 9 10营业收入利润率y (%)4.795.31 5.52 5.72 5.86 5.87 5.87 5.91 5.85 5.91(1)根据表中有关数据请在下图中补充完整y 与x 的折线图,判断y ^=a ^+b ^x 与y ^=c ^+d ^x 哪一个更适宜作为y 关于x 的回归方程类型,并说明理由;(2)根据(1)的判断结果及表中数据,建立y 关于x 的回归方程(系数精确到0.01); (3)根据(2)得出的回归方程,预测1~12月月累计营业收入利润率(%)的值为多少?参考公式:对于一组数据(u 1,v 1),(u 2,v 2),…,(u n ,v n ),其回归直线v ^=α^+β^u的斜率和截距的最小二乘估计分别为β^=∑ni =1(u i -u -)(v i -v -)∑n i =1(u i -u -)2,α^=v --β^u -.参考数据:x -y -w -∑10i =1(x i -x -)2∑10i =1(w i -w -)2∑10i =1(x i -x -)(y i -y -) ∑10i =1(w i -w -)(y i -y -) 5.505.662.2582.50 4.528.142.07表中w i =x i ,w -=110∑10i =1w i ,11≈3.32.解 (1)补充完整的折线图如下,可知选用y ^=c ^+d ^x 更适宜.理由:根据折线图知折线的形状更接近y =c +d x 的图象.(2)令w =x ,先建立y 关于w 的线性回归方程.∵d ^=∑10i =1(w i -w -)(y i -y -)∑10i =1(w i -w -)2=2.074.52≈0.46,∴c ^=y --d ^w -=5.66-0.46×2.25≈4.63, ∴y 关于w 的线性回归方程为y ^=4.63+0.46w , ∴y 关于x 的回归方程为y ^=4.63+0.46x .(3)由(2)可知,当x =11时,y ^=4.63+0.46×3.32≈6.16,∴预测1~12月月累计营业收入利润率(%)的值为6.16.星期四(解析几何) 2022年____月____日【题目4】 已知圆锥曲线x 2m +y 2n =1过点A (-1,2),且过抛物线x 2=8y 的焦点B .(1)求该圆锥曲线的标准方程;(2)设点P 在该圆锥曲线上,点D 的坐标为(|m |,0),点E 的坐标为(0,|n |),直线PD 与y 轴交于点M ,直线PE 与x 轴交于点N ,求证:|DN |·|EM |为定值. (1)解 抛物线x 2=8y 的焦点B 的坐标为(0,2). 将点A (-1,2),B (0,2)代入x 2m +y 2n =1,得⎩⎪⎨⎪⎧1m +2n =1,0m +4n =1,解得⎩⎨⎧m =2,n =4.所以该圆锥曲线的标准方程为y 24+x 22=1.(2)证明 由(1)可知该圆锥曲线为椭圆,且D (2,0),E (0,2). 设P (x 0,y 0),x 0≠2,y 0≠2, 则直线PD :y =y 0x 0-2(x -2), 令x =0,得M 点的纵坐标y M =-2y 0x 0-2,所以|EM |=⎪⎪⎪⎪⎪⎪2+2y 0x 0-2. 直线PE :y =y 0-2x 0x +2,令y =0,得N 点的横坐标x N =-2x 0y 0-2,所以|DN |=⎪⎪⎪⎪⎪⎪2+2x 0y 0-2. 所以|DN |·|EM |=⎪⎪⎪⎪⎪⎪2+2x 0y 0-2·⎪⎪⎪⎪⎪⎪2+2y 0x 0-2=⎪⎪⎪⎪⎪⎪2y 0-22+2x 0y 0-2·⎪⎪⎪⎪⎪⎪2x 0-22+2y 0x 0-2 =⎪⎪⎪⎪⎪⎪(2y 0+2x 0)-22y 0-2·(2y 0+2x 0)-22x 0-2 =⎪⎪⎪⎪⎪⎪2(y 20+2x 20-4y 0-42x 0+22x 0y 0+4)x 0y 0-2x 0-2y 0+22. 因为点P 在椭圆上,所以y 204+x 202=1,即y 20+2x 20=4,所以|DN |·|EM |=⎪⎪⎪⎪⎪⎪2(4-4y 0-42x 0+22x 0y 0+4)x 0y 0-2x 0-2y 0+22 =⎪⎪⎪⎪⎪⎪2(-4y 0-42x 0+22x 0y 0+8)x 0y 0-2x 0-2y 0+22=42, 故|DN |·|EM |为定值.星期五(立体几何) 2022年____月____日【题目5】 在斜三棱柱ABC-A 1B 1C 1中,△ABC 为等腰直角三角形,AA 1=2AB =2AC =22,平面BB 1C 1C ⊥平面ABC ,点E 为棱A 1A 的中点,∠B 1BC =60°.(1)证明:平面B 1CE ⊥平面BB 1C 1C ; (2)求平面AB 1C 与平面B 1CE 的夹角的余弦值.(1)证明 如图,分别取BC ,B 1C 的中点O ,F ,连接OA ,OF ,EF ,因为AB =AC ,O 为BC 的中点,所以AO ⊥BC .因为平面BB 1C 1C ⊥平面ABC ,且平面BB 1C 1C ∩平面ABC =BC ,AO ⊂平面ABC , 所以AO ⊥平面BB 1C 1C .因为F 是B 1C 的中点,所以FO ∥BB 1,且FO =12BB 1. 因为点E 为棱A 1A 的中点, 所以AE ∥BB 1,且AE =12BB 1.所以FO ∥AE ,且FO =AE ,所以四边形AOFE 是平行四边形,所以EF ∥AO . 因为AO ⊥平面BB 1C 1C ,所以EF ⊥平面BB 1C 1C . 因为EF ⊂平面B 1CE ,所以平面B 1CE ⊥平面BB 1C 1C .(2)解 连接B 1O ,由题意易证B 1O ⊥BC ,则B 1O ⊥平面ABC ,故OA ,OC ,OB 1两两垂直.以O 为坐标原点,OA →,OC →,OB 1→的方向分别为x ,y ,z 轴的正方向,建立空间直角坐标系O-xyz ,则A (2,0,0),C (0,2,0),B 1(0,0,6),E ⎝⎛⎭⎪⎫2,22,62,故B 1C →=(0,2,-6),CE →=⎝ ⎛⎭⎪⎫2,-22,62,AC →=(-2,2,0). 设平面B 1CE 的法向量为m =(x 1,y 1,z 1), 则⎩⎨⎧m ·B 1C →=2y 1-6z 1=0,m ·CE →=2x 1-22y 1+62z 1=0, 令z 1=1,得m =(0,3,1).设平面AB 1C 的法向量为n =(x 2,y 2,z 2), 则⎩⎪⎨⎪⎧n ·B 1C →=2y 2-6z 2=0,n ·AC →=-2x 2+2y 2=0,令y 2=3,得n =(3,3,1), 则cos 〈m ,n 〉=m ·n |m ||n |=43+1×3+3+1=277.所以平面AB1C与平面B1CE的夹角的余弦值为27 7.星期六(函数与导数)2022年____月____日【题目6】已知函数f(x)=x e x-2ax+a(a∈R).(1)当a=0时,求f(x)在[-2,2]上的最值;(2)设g(x)=2e x-ax2,若h(x)=f(x)-g(x)有两个零点,求a的取值范围.解(1)当a=0时,f(x)=x e x,∴f′(x)=e x(x+1).当x<-1时,f′(x)<0;当x>-1时,f′(x)>0.当x∈[-2,2]时,f(x)在[-2,-1)上单调递减,在(-1,2]上单调递增,∴f(x)min=f(-1)=-1 e.又f(-2)=-2e2,f(2)=2e2,∴f(x)max=2e2.综上,f(x)在[-2,2]上的最大值为2e2,最小值为-1 e.(2)h(x)=f(x)-g(x)有两个零点,⇒(x-2)e x+a(x-1)2=0有两解.当x=1时,不满足题意,当x≠1时,-a=(x-2)e x (x-1)2,即y=-a与y=(x-2)e x(x-1)2的图象有两个交点,令F(x)=(x-2)e x(x-1)2,x∈(-∞,1)∪(1,+∞),所以F′(x)=(x-1)2e x-2(x-2)e x(x-1)3=(x2-4x+5)e x(x-1)3=[(x-2)2+1]e x(x-1)3,当x∈(-∞,1)时,F′(x)<0,所以F(x)单调递减;当x∈(1,+∞)时,F′(x)>0,所以F(x)单调递增.F(x)的大致图象如图所示,所以由y=-a与F(x)的图象有两个交点,可得到-a<0,所以a>0,综上a的取值范围是(0,+∞).。
《GEMS》解题报告

珠宝给一棵n个结点的树,给每个点安排一个正整数编号,使得相邻点具有不同的编号,编号的总和尽量小。
输入第一行:n(n<=50,000)以下n-1行,每行两个数u,v(1<=u,v<=n),表示u 和v有一条边输出仅一行,为最小编号和样例输入81 21 31 41 55 65 75 8样例输出11分析:看完题目,很自然地联想到树型DP,而且也不难得到状态表示方法。
先根据输入的数据构造出一棵树,然后从树的叶子结点往上倒推。
设F[I,J]表示以I为根的子树在I的编号为J时,可以得到的最小编号和。
状态转移方程为:F[I,J] = Min{∑F[I1, J1]} + J其中I1表示I的一个子结点编号,J1为不同于J的一个自然数。
很显然,在最优方案中,所有解的编号都是不可能超过N的。
因此不难推出算法的时间复杂度为O(N^3),空间复杂度为O(N^2)。
这对于本题的规模来说,是无法承受的。
分析一下几个比较小的数据,会发现在最优方案中,最大的编号全部都没有达到N,不妨设其为M。
而且凭感觉来看,M比N要小很多。
很自然地,我们会考虑计算出这个比N小的M,然后DP的时候只要对每个点考虑编号为1到M的状态即可。
这样时间复杂度就降为O(NM^2),空间复杂度降为O(NM)。
但是M究竟怎么得到呢?我们发现这是很难计算的,而且也不太好估算出一个界(至少我没有想到好的方法)。
事实上可以采取一种比较无奈的方法。
因为N 最大为50000,时限为1S,所以要想算法在理论上的最坏情况下不超时,M取30左右比较保险,实践证明,M取30足以通过所有测试数据了。
似乎通过上面的分析本题已经解决得差不多了,但M毕竟是“贪”出来的,正确性不能得到理论上的证明,我们不妨从算法优化的角度来考虑这个问题。
还是回到最初的DP算法。
仔细推敲一下就会发现,F[I,1 .. M]这M个状态中,能够在以后的状态转移中真正利用到的只有两个,它们是这M个状态中值最小的两个。
USACO(Train)解题报告
USACO(Train)部分Chapter1Section 1.1Y our Ride Is Here (ride)这大概是一个容易的问题,一个“ad hoc”问题,不需要特殊的算法和技巧。
Greedy Gift Givers (gift1)这道题的难度相当于联赛第一题。
用数组incom、outcom记录每个人的收入和支出,记录每个人的名字,对于送礼人i,找到他要送给的人j,inc(incom[j],outcom[i] div n),其中n 是要送的人数,最后inc(incom[i],outcom[i] mod n),最后输出incom[i]-outcom[i]即可。
(复杂度O(n^3))。
用Hash表可以进行优化,降复杂度为O(n^2)。
Friday the Thirteenth (friday)按月为单位计算,模拟运算,1900年1月13日是星期六(代号1),下个月的13日就是代号(1+31-1) mod 7+1的星期。
因为数据小,所以不会超时。
当数据比较大时,可以以年为单位计算,每年为365天,mod 7的余数是1,就是说每过一年所有的日和星期错一天,闰年第1、2月错1天,3月以后错2天。
这样,只要先求出第一年的解,错位添加到以后的年即可。
详细分析:因为1900.1.1是星期一,所以1900.1.13就等于(13-1) mod7+1=星期六。
这样讲可能不太清楚。
那么,我来解释一下:每过7天是一个星期。
n天后是星期几怎么算呢?现在假设n是7的倍数,如果n为14,那么刚好就过了两个星期,所以14天后仍然是星期一。
但如果是过了15天,那么推算就得到是星期二。
这样,我们就可以推导出一个公式来计算。
(n天mod 7(一个星期的天数)+ 现在日期的代号) mod 7 就等于现在日期的代号。
当括号内的值为7的倍数时,其代号就为0,那么,此时就应该是星期日这样,我们可以得出题目的算法:int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}int b[8]={0}a数组保存一年12个月的天数(因为C语言中数组起始下标为0,所以这里定义为13)。
noip2011_解题报告_观光公交
【问题描述】风景迷人的小城Y 市,拥有n 个美丽的景点。
由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。
观光公交车在第0 分钟出现在1号景点,随后依次前往2、3、4……n 号景点。
从第i 号景点开到第i+1 号景点需要Di 分钟。
任意时刻,公交车只能往前开,或在景点处等待。
设共有m 个游客,每位游客需要乘车1 次从一个景点到达另一个景点,第i 位游客在Ti 分钟来到景点Ai,希望乘车前往景点Bi(Ai<Bi)。
为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。
假设乘客上下车不需要时间。
一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。
因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。
于是聪明的司机ZZ 给公交车安装了k 个氮气加速器,每使用一个加速器,可以使其中一个Di 减1。
对于同一个Di 可以重复使用加速器,但是必须保证使用后Di 大于等于0。
那么ZZ 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?【输入】输入文件名为bus.in。
第1 行是3 个整数n, m, k,每两个整数之间用一个空格隔开。
分别表示景点数、乘客数和氮气加速器个数。
第2 行是n-1 个整数,每两个整数之间用一个空格隔开,第i 个数表示从第i 个景点开往第i+1 个景点所需要的时间,即Di。
第3 行至m+2 行每行3 个整数Ti, Ai, Bi,每两个整数之间用一个空格隔开。
第i+2 行表示第i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。
【输出】输出文件名为bus.out。
共一行,包含一个整数,表示最小的总旅行时间。
【输入输出样例】bus.in bus.out3 3 21 40 1 31 1 25 2 310【输入输出样例说明】对D2 使用2 个加速器,从2 号景点到3 号景点时间变为2 分钟。
b_station解题报告(sgu148枚举+堆)
SGU148 B-Station试题描述在离著名的国家Berland不远的地方,有一个水下工作站。
这个工作站有N层。
已知:是第i层装有Wi 的水,最多可以容纳Li的水,恐怖分子炸毁第i层的代价是Pi。
第i层一旦被炸毁,该层所有的水都将倾泻到第i+1层。
如果某一层的水量超过了它的容量(即Li),那么该层就将自动被毁坏,所有的水也会倾泻到下一层。
Pivland的恐怖分子想要用最少的钱毁掉第N层,现在他雇佣你来计算,需要炸毁哪些层。
输入第一行有一个自然数N(1<=n<=15000)。
接下来的N行,每行3个整数Wi, Li, Pi(0<=Wi,Li,Pi<=15000)。
输出输出需要炸毁的层的编号。
样例Input31000 1000 10 1000 22 10 100Output12解题报告B-Station解题报告【题意分析】令Si =W1+W2+…+Wi(特别的S=0)。
不妨设恐怖分子炸毁的第高层是第p层(第一层是最高层,第N层是最底层)。
因为恐怖分子的目标是毁灭第N层,所以水必须从第p层一直泻下去。
如果存在一个i,满足Wp +Wp+1+…+Wi-1+Wi<=Li,也就是说前面几层的水全部泄下来也无法把第i层自动冲毁,那么就必须要使用炸药把它炸开了。
所以恐怖分子需要炸毁的层的集合就是Bomb[p]={p}∪{i |i>p Si -Sp-1<=Li}令Qi =Si-Li,那么:Bomb[p]={p}∪{i |i>p Qi <=Sp-1}我们枚举p,然后看哪些层需要炸毁。
这样就得到了一个O(n2)的算法。
【设计算法】n<=15000,O(n2)的算法效率太低。
注意到Sp是随着p的增加而递增的,观察两个集合:Bomb[p]={p}∪{i |i>p Qi <=Sp-1}Bomb[p-1]={p-1}∪{i |i>p-1 Qi <=Sp-2}因为Sp-2<=Sp-1,所以{i |i>p-1 Qi<=Sp-2} Bomb[p]。
POJ1007解题报告
POJ1007题名描述:DescriptionOne measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to its right and E is greater than one letter to its right. This measure is called the number of inversions in the sequence. The sequence ``AACEDGG'' has only one inversion (E and D)---it is nearly sorted---while the sequence ``ZWQM'' has 6 inversions (it is as unsorted as can be---exactly the reverse of sorted).You are responsible for cataloguing a sequence of DNA strings (sequences containing only the four letters A, C, G, and T). However, you want to catalog them, not in alphabetical order, but rather in order of ``sortedness'', from ``most sorted'' to ``least sorted''. All the strings are of the same length.InputThe first line contains two integers: a positive integer n (0 < n <= 50) giving the length of the strings; and a positive integer m (0 < m <= 100) giving the number of strings. These are followed by m lines, each containing a string of length n.OutputOutput the list of input strings, arranged from ``most sorted'' to ``least sorted''. Since two strings can be equally sorted, then output them according to the orginal order.Sample Input10 6AACATGAAGGTTTTGGCCAATTTGGCCAAAGATCAGATTTCCCGGGGGGAATCGATGCATSample OutputCCCGGGGGGAAACATGAAGGGATCAGATTTATCGATGCATTTTTGGCCAATTTGGCCAAA这道题的题意是输入N个字符串,按照字符串的逆序数由最少到最大开始输出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目一:A+B
1、sample input 1 5
10 20
Sample output 6
30
解题思路:while(scanf("%d %d",&a,&b)!=EOF) 表示返回输入的数据和格式字符串
中匹配次数。
解决方案:
#include
int main()
{
int a,b;
while(scanf("%d %d",&a,&b)!=EOF)
printf("%d\n",a+b);
return 0;
}
题目二:Text reserve
1.sample input
3
olleh !dlrow
m'I morf .udh
I ekil .mca
sample output
hello world!
I'm from hdu.
I like acm.
解题思路:用数组保存单词,将不是空格的字符保存在一个数组中,当遇到空格时,
将这个数组中的元素从后往前输出。
解题方案:
#include
#include
int main()
{
int i,n,len,j,k,t;
char s1[1005],s2[100];
scanf("%d",&n);
getchar();
while(n--)
{
gets(s1);
len=strlen(s1);
for(i=0,j=0,t=0;i
if(s1[i]!=' ')
s2[j++]=s1[i];
else
{
if(t>0) printf(" ");
for(k=j-1;k>=0;k--)
printf("%c",s2[k]);
j=0;
t++;
}
if(i==len-1)
{
printf(" ");
for(k=j-1;k>=0;k--)
printf("%c",s2[k]);
}
}
printf("\n");
}
return 0;
}
题目三:quicksum
Sample input ACM
MID CENTRAL
REGIONAL PROGRAMMING CONTEST
ACN
A C M
ABC
BBC
#
Sample output
46
650
4690
49
75
14
15
解题思路:利用字符串和for语句实现编程
解题方案:
#include
#include
int main()
{
char str[10000];
int len,i,a[26],sum;
for(i = 0;i<26;i++)
{
a[i] = i+1;
}
while(gets(str))
{
if(strcmp(str,"#") == 0)
break;
len = strlen(str);
sum = 0;
for(i = 0;i
if(str[i]>='A' && str[i]<='Z')
sum+=(i+1)*a[str[i]-'A'];
}
printf("%d\n",sum);
}
return 0;
}