信息学奥赛

信息学奥赛C++语言:校门外的树

守給你的承諾、 提交于 2019-11-27 22:03:05
【题目描述】 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。 由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。 【输入】 第一行有两个整数L(1 ≤ L ≤ 10000)和 M(1 ≤ M ≤ 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。 对于20%的数据,区域之间没有重合的部分;对于其它的数据,区域之间有重合的情况。 【输出】 包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。 【输入样例】 500 3 150 300 100 200 470 471 【输出样例】 298 代码 #include<cstdio> using namespace std; int a[10001],n,m,x,y,s=0; int main() { scanf("%d%d",&n,&m); for(int i=0;i<=n

轻拍牛头(信息学奥赛一本通 1621)

梦想与她 提交于 2019-11-27 21:29:20
【题目描述】 原题来自:USACO 2008 Dec. Silver 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏。 贝茜让 N 头奶牛坐成一个圈。除了 1 号与 N 号奶牛外, i 号奶牛与 i−1 号和 i +1 号奶牛相邻, N 号奶牛与 1 号奶牛相邻。农夫约翰用很多纸条装满了一个桶,每一张包含了一个 1 到 10 6 的数字。 接着每一头奶牛 i 从桶中取出一张纸条 Ai ,每头奶牛轮流走一圈,同时拍打所有「编号是 Ai 的约数」的牛,然后走回到原来的位置。牛们希望你帮助他们确定,每一头奶牛需要拍打的牛。 【输入】 第一行包含一个整数 N; 接下来第二到第 N +1 行每行包含一个整数 A i 。 【输出】 第一到第 N 行,第 i 行的输出表示第 i 头奶牛要拍打的牛数量。 【输入样例】 5 2 1 2 3 4 【输出样例】 2 0 2 1 3 【提示】 数据范围与提示: 对于全部数据, 1 ≤ N ≤ 10 5 。 事实上这道题放在“质数”里面好像没什么道理,最多就是用到了一点类似于 埃拉托色尼筛法 的思想 放上代码: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e5+1; 4 int a[N],n,Max,ans[N*100],cnt[N*100]; 5 inline

异象石(信息学奥赛一本通 1554)

对着背影说爱祢 提交于 2019-11-27 08:18:00
【题目描述】 原题来自:Contest Hunter Round #56 在 Adera 的异时空中有一张地图。这张地图上有 N N 个点,有 N − 1 N−1 条双向边把它们连通起来。起初地图上没有任何异象石,在接下来的 M M 个时刻中,每个时刻会发生以下三种类型的事件之一: 地图的某个点上出现了异象石(已经出现的不会再次出现); 地图某个点上的异象石被摧毁(不会摧毁没有异象石的点); 向玩家询问使所有异象石所在的点连通的边集的总长度最小是多少。 请你作为玩家回答这些问题。下图是一个例子,灰色节点表示出现了异象石,加粗的边表示被选为连通异象石的边集。 【输入】 第一行有一个整数 N N,表示点的个数; 接下来 N − 1 N−1 行每行三个整数 x , y , z x,y,z,表示点 x x 和 y y 之间有一条长度为 z z 的双向边; 第 N + 1 N+1 行有一个正整数 M M; 接下来 M M 行每行是一个事件,事件是以下三种格式之一: + x + x:表示点 x x 上出现了异象石; − x − x:表示点 x x 上的异象石被摧毁; ? ?:表示询问使当前所有异象石所在的点连通所需的边集的总长度最小是多少。 【输出】 对于每个 ? ? 事件,输出一个整数表示答案。 【输入样例】 6 1 2 1 1 3 5 4 1 7 4 5 3 6 4 2 10 + 3 +

家庭作业(信息学奥赛一本通 1430)

99封情书 提交于 2019-11-26 23:43:11
【题目描述】 老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的。例如如果一个作业学分为10,要求在6天内交,那么要想拿到这10学分,就必须在第6天结束前交。 每个作业的完成时间都是只有一天。例如,假设有7次作业的学分和完成时间如下: 作业号 1 2 3 4 5 6 7 期限 1 1 3 3 2 2 6 学分 6 7 2 1 4 5 1 最多可以获得15学分,其中一个完成作业的次序为2,6,3,1,7,5,4,注意可能d还有其他方法。 你的任务就是找到一个完成作业的顺序获得最大学分。 【输入】 第一行一个整数N,表示作业的数量。 接下来N行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。 【输出】 输出一个整数表示可以获得的最大学分。保证答案不超过longint范围。 【输入样例】 7 1 6 1 7 3 2 3 1 2 4 2 5 6 1 【输出样例】 15 这道题和ybt上的1426 智力大冲浪 比较相像,一开始我就是直接用1426的代码做的,上代码—— 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int k,m,p,w,ans,l,s; 5 bool u[1000001]; 6 struct node{

信息学奥赛C++语言:统计正数

无人久伴 提交于 2019-11-26 22:38:17
【题目描述】 输入若干整数,以 0 结尾,统计其中有多少个正整数。 【输入】 一行若干整数,最后一个为 0。 【输出】 一行一个整数,表示输入的数据中正整数的个数。 【输入样例】 3 6 -3 2 0 【输出样例】 3 代码 #include<cstdio> using namespace std; int b,s=0; int main() { scanf("%d",&b); if(b>0) s++; while(b!=0) { scanf("%d",&b); if(b>0) s++; } printf("%d",s); return 0; } 来源: https://blog.csdn.net/zsbailong/article/details/99120575

信息学奥赛C++语言:投资收益

寵の児 提交于 2019-11-26 22:37:50
【题目描述】 小华在去年赚了一大笔钱。他想把这些钱用于投资,并对自己能得到多少收益感到好奇。 已知投资的年利率为 r(0~20 之间的整数),小华现有 m 元钱。他想知道投资多少年后,他的钱将会超过 y 元。 【输入】 一行三个整数 r、m 和 y,相邻两个整数之间用一个空格隔开。m 为 100~1000000 之间的整数。 【输出】 一行一个整数,即要投资的年数。保证答案的范围在 1~400 之间。 【输入样例】 5 5000 6077 【输出样例】 4 代码 #include<iostream> using namespace std; double r,m,y,s=0; int main() { cin>>r>>m>>y; r=r/100; while(m<=y) { m=m*(1+r); s++; } cout<<s; return 0; } 来源: https://blog.csdn.net/zsbailong/article/details/99120800

信息学奥赛C++语言:求平均分

眉间皱痕 提交于 2019-11-26 22:37:33
【题目描述】 求三鑫学校某次信息学竞赛同学们的平均分,以-1表示输入结束。 【输入】 一行若干实数,最后一个为 -1。 【输出】 一行一个实数,表示平均分,输出保留2位小数。 【输入样例】 100 95 63.5 78.5 85 -1 【输出样例】 84.40 代码 #include<cstdio> using namespace std; double a,b=1,c; int k; int main() { scanf("%lf",&a); while(a!=-1) { c=c+a; k++; scanf("%lf",&a); } if(k!=0) printf("%.2lf",c/k); return 0; } 来源: https://blog.csdn.net/zsbailong/article/details/99121560

信息学奥赛C++语言:火柴盒

风格不统一 提交于 2019-11-26 22:37:27
【题目描述】 火柴盒长为L,宽为W(1<=L,W<=100),高度无限高,给你N(1<=N<=50)根火柴,知道每一根火柴的长度,问有多少根火柴可以横着放进该火柴盒。 【输入】 第一行输入N,L和W。 接下来N行每行输入一个1到1000范围内的一个整数,表示火柴的长度。 【输出】 输出能够装进火柴盒的火柴的数量。 【输入样例】 样例1: 5 3 4 3 4 5 6 7 样例2: 2 12 17 21 20 【输出样例】 样例1: 3 样例2: 1 代码 #include<cstdio> #include<cmath> using namespace std; int a,b,c,d,k=0,t; int main() { scanf("%d%d%d",&a,&b,&c); d=d+sqrt(b*b+c*c); for(int i=1;i<=a;i++) { scanf("%d",&t); if(t<=b||t<=c||t<=d) k++; } printf("%d",k); return 0; } 来源: https://blog.csdn.net/zsbailong/article/details/99123399

信息学奥赛C++语言:金币

♀尐吖头ヾ 提交于 2019-11-26 22:37:10
【题目描述】 国王将金币作为工资,发放给忠诚的骑士。第1天,骑士收到一枚金币;之后两天(第2天和第3天)里,每天收到两枚金币;之后三天(第4、5、6天)里,每天收到三枚金币;之后四天(第7、8、9、10天)里,每天收到四枚金币……这种工资发放模式会一直这样延续下去:当连续n天每天收到n枚金币后,骑士会在之后的连续n+1天里,每天收到n+1枚金币(n为任意正整数)。你需要编写一个程序,确定从第一天开始的给定天数内,骑士一共获得了多少金币。 【输入】 一个整数(范围1到10000),表示天数。 【输出】 骑士获得的金币数。 【输入样例】 6 【输出样例】 14 代码 #include<cstdio> using namespace std; int n,i,j,s=0,t=0; int main() { scanf("%d",&n); for(i=1;;i++) { for(j=1;j<=i;j++) { s=s+i; t++; if(t==n) { printf("%d",s); return 0; } } } return 0; } 来源: https://blog.csdn.net/zsbailong/article/details/99123570

最大子矩阵(信息学奥赛一本通 1224)

牧云@^-^@ 提交于 2019-11-26 17:10:22
【题目描述】 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。 【输入】 输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。 【输出】 输出最大子矩阵的大小。 【输入样例】 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 【输出样例】 15 首先,如果这道题暴力搜索矩阵的两个端点,再依次计算矩阵和求最大(大致需要六个循环)在ybt上只能得30分,其余都会TLE 那么,我们在暴力的基础上,给这道题加个小小的优化—— 前缀和 (只需四重循环): 关于具体的前缀和思想,请看☟☟☟ https://www.cnblogs.com/ljy-endl/p/11325425.html 虽然这样呢已经可以过了,但是精益求精的好孩子( 对就是我没错) 是不会就这样算了,我们进一步在前缀和的基础上加上 贪心 的思想(三重循环): 这样就感觉 肥肠完美 (当然也可能有大佬想出了更加高级的算法)还是当我没说吧...上代码! 1 #include<bits/stdc++.h> 2 using