oj

Comet OJ - Contest #12

ぐ巨炮叔叔 提交于 2019-12-01 06:43:00
这可能是我离小裙子最近的一次 B 整个表格其实是一些联通块,取反操作不能跨连通块。所以直接统计一下每个连通块内数字不对的个数是不是偶数即可 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define gt(x,y) ((x)*m+y) using namespace std; const int M = 1100000; int n,m,k,a[M],b[M],d[M],T,r,c,cnt=0,s[M]; char C[M]; bool check(int x,int y) { if(x<0 || y<0 || x>=n || y>=m) return 0; return 1; } void dfs(int x,int y) { if(!check(x,y)) return ; if(d[gt(x,y)]) return ; d[gt(x,y)]=cnt; dfs(x-r,y); dfs(x+r,y); dfs(x,y-c); dfs(x,y+c); } int main() { scanf("%d",&T); for(;T;T--) { scanf("%d%d%d%d",&n,&m,&r,&c); int B=1; cnt=0; for(int i=0;i<n;i++) for

cqyz oj | 重建道路

时间秒杀一切 提交于 2019-12-01 04:54:55
Description   一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树。John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。   PS:最少需要去掉多少条边才能获得一棵含p个结点的子树。 Input   第1行:2个整数,N和P  第2..N行:每行2个整数I和J,表示节点I是节点J的父节点。 Output   单独一行,包含一旦被破坏将分离出恰含P个节点的子树的道路的最小数目。 Sample Input 1 11 6 1 2 1 3 1 4 1 5 2 6 2 7 2 8 4 9 4 10 4 11 Sample Output 1 2 Hint 1≤N≤150 题目给出了一棵有根树,须先要根据输入的信息确定根结点的编号 root。样例画出的树型图如下。 由上面可以看出,针对以 i 为根的树,根 i 有 2 种状态: 状态 0、i 不在要保留的子树中; 状态 1、i 在要保留的子树中; 所以,可以状态函数的定义如下: 状态函数定义: 𝑓(𝑖, 𝑥, 0)表示以 i 为根的树中,获得一棵 x 个结点的子树

cqyz oj | 阿里巴巴

旧街凉风 提交于 2019-12-01 02:59:42
Description   在一条直线上有 n 件珠宝,已知每件珠宝的位置xi,并且第 i 件珠宝在 ti 时刻(单位:秒)就消失,问能否将所有的珠宝收集起来?如果能,求出最短时间。搜集能瞬间完成,但收集的人每秒只能移动一个单位的距离。 Input   若干组数据,每组数据的第一行为n,表示有n颗珠宝,接下来的n行,每行宝行两个整数:x,t,表示珠宝的位置和消失时间。 Output   如果有解,则输出一个整数,表示将所有珠宝收集完的最早完成时间,否则输出No solution。 Sample Input 1 5 1 3 3 1 5 8 8 19 10 15 5 1 5 2 1 3 4 4 2 5 3 Sample Output 1 11 No solution Hint n<=10000 0<=x,t<=10^9 网上分析: f(i,j,0)表示区间i~j中获得所有宝藏并且停留在左端点,f(i,j,1)停留在右端点 ans=min(f(1,n,0),f(1,n,1)) i=j时,f(i,j,0)=f(i,j,1)=0; f(i,j,0)=min(f(i+1,j,1)+x[i+1]-x[i],f(i+1,j,0)+x[j]-x[i]) f(i,j,1)=min(f(i,j-1,0)+x[j]-x[j-1],f(i,j-1,1)+x[j]-x[i]) 填表的时候需要按照主对角线填入

cqyz oj | 涂色

冷暖自知 提交于 2019-12-01 02:54:23
Description   假设你有一条长度为5的木版,初始时没有涂过任何颜色。你希望把它的5个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为5的字符串表示这个目标:RGBGR。   每次你可以把一段连续的木版涂成一个给定的颜色,后涂的颜色覆盖先涂的颜色。例如第一次把木版涂成RRRRR,第二次涂成RGGGR,第三次涂成RGBGR,达到目标。   用尽量少的涂色次数达到目标。 Input   输入仅一行,包含一个长度为n的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。 Output   仅一行,包含一个数,即最少的涂色次数。 Sample Input 【输入1】   AAAAA 【输入2】   RGBGR Sample Output 【输出1】   1 【输出2】   3 Hint 40%的数据满足:1<=n<=10 100%的数据满足:1<=n<=50 缩短再区间DP; 用pre数组记录当前字符上次出现的位置,可以在DP时减小所花时间 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int maxn = 55, inf =

cqyz oj | 旅馆

故事扮演 提交于 2019-12-01 02:53:10
Description   小沐几年前到德国去旅游时住过一间旅店,觉得它非常有特色,这次旅游打算还要住那里。但是他已经记不清旅店的名字了,于是他使用通配符"*"和"?"和26个小写字母来描述。注意,这里的"*"代表0个或任意多个字母,"?"代表一个字母。   小沐在网上找到了一系列旅店的名字,他想知道有多少间旅店能与他的描述相匹配。 Input   包含多组数据。每组数据的第一行为一个字符串,表示小沐印象中的旅店名字描述;接下来一行为一个整数n,表示在网上找到的一些旅店名字数量;再接下来的n行,每行一个字符串,表示网上提供的旅店名字。 Output   针对每组数据,输出一个整数,表示与小沐印象中的旅店名字相匹配的网上的旅店名字的数量。 Sample Input 1 herbert 2 amazon herbert ?ert* 2 amazon herbert * 2 amazon anything herbert? 2 amazon herber Sample Output 1 1 0 2 0 Hint n<=10000 , 每个字符只由'*'和'?'和26个小写字母组成,串长度不超过50。 a[]表示印象中的描述 b[]表示搜到的旅馆 d[i][j]表示a的前i个和b的前j个能不能匹配 方程见代码 #include<iostream> #include<cstdio>

【python3】OJ 1002 Biorhythms

女生的网名这么多〃 提交于 2019-11-30 23:19:23
今天做一个oj题目 Biorhythms ,按给定的示例可以通过,但是提交总是wa(Wrong Answer),但是又看不到错误信息,于是找到了一个工具网站 https://loj.ac/problem/10217 练习,这个工具最大的好处可以看到输出是否错误,于是乎就按着这个工具的数据进行修改,发现自己的代码缺少了一些判断条件,于是根据对应的数据和输出修改最终通过,但是不知道这算不算作弊😱。 下面是我修改后的代码,虽然最后通过了,但是耗时比较长,仍有很大进步空间,有时间再改改。 # -*- coding: UTF-8 -*- # 最小值的索引 def min_index(tmp): i = 0; if tmp[1] < tmp[0]: i = 1; if tmp[2] < tmp[1]: i = 2; return i; # 重复值 def repeat_value(temp_list): res = -1; # 周期 cycle_list = [23, 28, 33]; while True: # 如果三个值相等表示达到三重峰值,且需要此日期大于给定日期 if temp_list[0] == temp_list[1] and temp_list[1] == temp_list[2] and temp_list[0] > temp_list[3]: # 计算相差天数 res =

【python3】OJ 1001 487-3279 Time Limit Exceeded

£可爱£侵袭症+ 提交于 2019-11-30 23:15:50
最近学习python,在山东理工大学的oj上刷题( 487-3279 ),但是才做到第二个题就老是TLE(Time Limit Exceeded),自己本机执行示例明明可以的,但是一提交就超时,后来发现题目中有个 (up to 100,000) ,意思就是最大有10万条数据,那就在本地模拟一下,我去,瞬间让我感觉不对,本来应该很快执行结束的却花了我3分多钟,怪不得超时呢,后来研究了下,改进了下代码(仍有进步空间,我看到ac的最快用时600ms),使用了字典,执行时间在1秒左右了,提交终于通过了,那个激动啊🤩。 代码如下,供和我一样遇到问题的同学参考,希望少走点弯路 # -*- coding: UTF-8 -*- # 输入的电话号码个数 num = int(input()); # 最多十万个 if num >= 100000: num = 100000; # 电话号码 input_array = []; # 已输入的个数 flag = 0; # 处理之后的电话 phone_array = []; # 重复的电话和数量字典 phone_repeat_dict = {}; while (flag < num): # 存储所有输入的电话 input_array.append(input()); flag += 1; for tmp in input_array: # 替换中横线 if '-

Comet OJ 计算机(computer)

强颜欢笑 提交于 2019-11-30 15:49:32
Comet OJ 计算机(computer) 题目传送门 题目描述 小 X 有一台奇怪的计算机。 这台计算机首先会读入一个正整数 n n ,然后生成一个包含 n n 个数的序列 a a 。 一开始 a_i(1 \le i \le n)*a**i (1≤ i ≤ n*) 的值均为 11。 接下来,小 X 会进行 n-1 n −1 次操作,每次操作会输入一个指令,这个指令有 22 种情况: x + 表示把此时序列中第 x x 个数 a_x*a**x* 和第 x+1 x +1 个数 a_{x+1} a x +1 合并为一个数,值为 a_x + a_{x+1} a x +*a**x*+1。 x * 表示把此时序列中第 x x 个数 a_x*a**x* 和第 x+1 x +1 个数 a_{x+1} a x +1 合并为一个数,值为 a_x \times a_{x+1} a x ×*a**x*+1。 假设某个时刻序列中元素的个数为 k k ,小 X 必须保证 1 \le x < k1≤ x < k 。 那么,经过 n-1 n −1 次操作后,序列只剩下了一个数,此时计算机会输出这个数。 小 X 想知道,当他输入 n n 时,这台计算器输出的数 最大 会是多少。 由于这个数可能会很大,你只需要求出这个数模 10^9+7109+7 的值。 输入描述 一行一个正整数 n n 。 输出描述

cqyz oj | 花园游戏

跟風遠走 提交于 2019-11-30 14:58:16
Description   已知:这是一个 1×N 的花园,被分成了 N 个格子,每个格子里有一种神奇的樱花,看到第 i 个格子上的花,洋娃娃会得到满足度 Ci (每个花的满足度只被计算一次)。现在洋娃娃从任意格子走进花园,当然从第 i 个格子进去会消耗 Di 个单位的满足度,然后游历花园,在一个格子向右走需要耗费 R 个单位的满足度,向左走需要耗费 L 个单位的满足度,最后从第 i 个格子出花园又要耗费 Fi 个单位的满足度。   接下来,需要设计一套游历方案,使得最终获得的总满足度最高。 Input   第一行依次给出三个正整数N,L,R。  第二行有N个整数,第i个数为Di。  第三行有N个整数,第i个数为Fi。  第四行有N个整数,第i个数为Ci。 Output   仅需要输出一行包括一个整数,表示最大获得的满足度为多少。 Sample Input 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 Sample Output 1 1 Hint 对于30%数据,N<=10。 对于60%数据,N<=100。 对于100%数据,N<=1000,0<=L,R,D[i],F[i],C[i]<=1000000。 错误的贪心: 枚举i,j,找从i进直接走到j出去的最大值。 错误原因: 每个格子价值只计算一次,但是可以反复走

AK acm/oj.弦截法求方程f(x)=x^3-5x^2+16x-80=0的根

大城市里の小女人 提交于 2019-11-30 09:01:59
题目描述 使用弦截法求方程f(x)=x 3 -5x 2 +16x-80=0的根。方法如下: (1) 取两个不同点x1、x2,如果f(x1)和f(x2)符号相反,则(x1, x2)区间内必有一个根。如果f(x1)与f(x2)同符号,则应改变x1、x2,直到f(x1)、f(x2)异号为止。注意x1、x2的值不应相差太大,以保证(x1, x2)区间内只有一个根。 (2) 连接(x1,f(x1))和(x2,f(x2))两点,此线(即弦)交x轴于x,如下图所示: x点坐标可以用下式求出: 再从x求出f(x)。 (3) 若f(x)与f(x1)同符号,则根必在(x, x2)区间内,此时将x作为新的x1。如果f(x)与f(x2)同符号,则表示根在(x1,x)区间内,将x作为新的x2。 (4) 重复步骤(2)和步骤(3),直到|f(x)|<ε为止,ε是一个很小的数,例如10-6。此时认为f(x)≈0。 样例输入 2 6 样例输出 5.0000 方程f(x)=x 3 -5x 2 +16x-80的函数图像如下 示例代码 # include <bits/stdc++.h> using namespace std ; double f ( double x ) { return x * x * x - 5 * x * x + 16 * x - 80 ; } int main ( ) { double a ,