信息学奥赛

信息学奥赛一本通 1036:A×B问题

ぃ、小莉子 提交于 2019-12-18 02:20:50
1036:A×B问题 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 66315 通过数: 20735 【题目描述】 输入两个正整数AA和BB,求A×BA×B的值。注意乘积的范围和数据类型的选择。 【输入】 一行,包含两个正整数AA和BB,中间用单个空格隔开。1≤A,B≤500001≤A,B≤50000。 【输出】 一个整数,即 A×BA×B 的值。 【输入样例】 3 4 【输出样例】 12 【来源】 No # include <iostream> using namespace std ; int main ( ) { long long a , b ; cin >> a >> b ; cout << a * b; } 来源: CSDN 作者: 六水(´∇`) 链接: https://blog.csdn.net/weixin_45603484/article/details/103588471

信息学奥赛C++语言:最大数max(x,y,z)

允我心安 提交于 2019-12-16 06:55:39
【题目描述】 【输入】 输入a,b,c。 【输出】 求m,保留到小数点后三位。 【输入样例】 1 2 3 【输出样例】 0.200 代码 #include<cstdio> using namespace std; int max(int a,int b,int c); int a,b,c; double m; int main() { scanf("%d%d%d",&a,&b,&c); m=1.0*max(a,b,c)/(max(a+b,b,c)*max(a,b,b+c)); printf("%.3lf\n",m); return 0; } int max(int a,int b,int c) { int temp=a; if(a<b) temp=b; if(temp<c) temp=c; return temp; } 来源: CSDN 作者: zsbailong 链接: https://blog.csdn.net/zsbailong/article/details/103454162

信息学奥赛C++语言: 开关灯1

不羁岁月 提交于 2019-12-14 09:37:52
【题目描述】 假设有N盏灯(N为不大于5000的数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于N的正整数)也从1到M依次编号。第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做相反处理(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己编号倍数的灯做相反处理。请问:当第M个人操作之后,哪几盏灯是关闭的,输出关闭的灯的盏数 【输入】 输入正整数N和M,以单个空格隔开。 【输出】 一个整数,最后关闭的灯的盏数。 【输入样例】 10 10 【输出样例】 3 代码 # include <cstdio> using namespace std ; int a , b , z , s ; int main ( ) { scanf ( "%d%d" , & a , & b ) ; for ( int i = 1 ; i <= a ; i ++ ) { z = 0 ; for ( int j = 1 ; j <= b ; j ++ ) { if ( i % j == 0 && z == 1 ) z = 0 ; else { if ( i % j == 0 && z == 0 ) z = 1 ; } } if ( z != 0 ) s ++ ; } printf ( "%d"

信息学奥赛C++语言:哥德巴赫猜想

醉酒当歌 提交于 2019-12-10 02:50:59
【题目描述】 哥德巴赫猜想的命题之一是:大于6 的偶数等于两个素数之和。编程将6~100所有偶数表示成两个素数之和。 【输入】 无 【输出】 分行输出: 例如: 6=3+3 8=3+5…(每个数只拆开一次,请保证第一个加数最小)。 【输入样例】 无 【输出样例】 无 代码 # include <cstdio> # include <cmath> # include <iostream> using namespace std ; int su ( int n ) { if ( n < 2 ) { return 0 ; } for ( int i = 2 ; i <= sqrt ( n ) ; i ++ ) { if ( n % i == 0 ) return 0 ; } return 1 ; } int main ( ) { int i , j , n , p = 0 ; for ( i = 6 ; i <= 100 ; i + = 2 ) { for ( j = 2 ; j <= i / 2 ; j ++ ) { p = i - j ; if ( su ( j ) && su ( p ) ) { cout << i << '=' << j << '+' << p << endl ; break ; } } } return 0 ; } 来源: CSDN 作者: zsbailong

信息学奥赛C++语言: 直方图

前提是你 提交于 2019-12-10 01:06:48
【题目描述】 给定一个非负整数数组,统计里面每一个数的出现次数。我们只统计到数组里最大的数。 假设 Fmax(Fmax<10000)是数组里最大的数,那么我们只统计{0,1,2…Fmax}里每个数出现的次数。 【输入】 第一行n是数组的大小。1 ≤ n ≤ 10000。 紧接着一行是数组的n个元素。 【输出】 按顺序输出每个数的出现次数,一行一个数。如果没有出现过,则输出0。 对于例子中的数组,最大的数是3,因此我们只统计{0,1,2,3}的出现频数。 【输入样例】 5 1 1 2 3 1 【输出样例】 0 3 1 1 代码 #include<cstdio> using namespace std; int a[1001],b[1001],n,max; int main() { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d",&a[i]); b[a[i]]++; } for(int i=0;i<n;i++) { if(a[i]>max) max=a[i]; } for(int i=0;i<max;i++) printf("%d\n",b[i]); return 0; } 来源: CSDN 作者: zsbailong 链接: https://blog.csdn.net/zsbailong/article/details

红与黑(信息学奥赛一本通-T1216)

ε祈祈猫儿з 提交于 2019-12-04 05:17:00
【题目描述】 有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。 【输入】 包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下: 1)‘.’:黑色的瓷砖; 2)‘#’:白色的瓷砖; 3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。 当在一行中读入的是两个零时,表示输入结束。 【输出】 对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。 【输入样例】 6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0 【输出样例】 45 【源程序】 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define N 1001 using namespace std; int m,n; char ch; int maps[N][N]; int vis[N][N]; int dir[4][2]={{0

信息学奥赛一本通 高手训练1 统计方案数

匿名 (未验证) 提交于 2019-12-03 00:11:01
小B写了一个程序,随机生成了n个正整数,分别是a[1]…a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c。但是没过多久,小B就忘记了他选了哪些数,他想把所有可能的取数方案都找出来。 你能帮他计算一下一共有多少种取数方案吗?请把最后的方案数模1000000007后输出。 小B记得他至少取了一个数。 第一行三个正整数n,p,c,含义如题目所述。 接下来一行有n个正整数,表示生成的n个随机数。 一行一个数,方案数模1000000007。 2 7 2 1 2 2 对于30%的数据, \(n≤16\) 。 另有30%的数据, \(p≤10000\) 。 对于100%的数据, \(n ≤ 32\) , \(p≤10^9\) , \(c ≤ 10 ^ 9\) , \(a[i]<p\) ,其中 \(p\) 是质数。 【思路】 先分析一下数据范围,30%的数据是 \(n <= 16\) 的,而100%的数据 \(n <= 32\) ,看起来都是非常的小,很容易想到用搜索来做(而且分类就在深搜里面,所以我好像说的是废话) 看完 \(n\) 之后再来看 \(p\) , 对于30%的数据 \(p <= 10000\) , 而对于100%的数据 \(p <= 10 ^ 9\) ,这样很显然也是必须要用 long long 的,要不然要这么大的 \(p\) 没有什么用。 然后就可以开始做题了

信息学奥赛一本通 高手训练1 游戏通关

匿名 (未验证) 提交于 2019-12-03 00:09:02
XY在玩一个包含N个任务的游戏。每个任务完成时限为Ti(你可以认为还没开始做任务时的时间为0),奖励为Wi。由于XY技术的娴熟以及任务的简单,对于每个任务,他都可以在一个单位时间内完成。 XY想要知道他能够获得的最多的奖励。 第一行一个整数N,表示需要完成的任务数目。 接下来N行,每行两个整数T、W,分别表示完成这个任务的最后期限和完成这个任务后获得的奖励。 输出数据有且仅有一行,只包含一个整数,表示最多获得的奖励。 2 1 5 1 4 5 5 2 3 1 2 4 5 1 3 3 4 15 对于样例2,XY可以选择完成任务1、3、4和5,这样他可以获得奖励15。 对于10%的数据,N≤100,Ti≤100,Wi≤2000。 对于30%的数据,N≤1000,Ti≤5000,Wi≤2000。 对于50%的数据,N≤10000,Ti≤20000,Wi≤2000。 对于100%的数据,N≤200000,Ti≤200000,Wi≤2000。 【思路】 贪心 + 大根堆的题目,感jio一本通就喜欢贪心 + 大根堆的题目 瞎说的 比较好想的贪心题目 因为这个在每一个单位时间内都可以得到一个奖励 所以只需要将每个单位时间内能够得到的最高的奖励累加起来就好了 不过一个单位时间内的最高奖励不只有自己这个单位时间之前完成的那些任务 还有在这个单位时间之后完成的任务 可以这样想,任务1在a时间之前完成

信息学奥赛C++语言:求整数的和与均值

匿名 (未验证) 提交于 2019-12-02 23:36:01
【题目描述】 读入n(1≤n≤10000)个整数,求它们的和与均值。 【输入】 输入第一行是一个整数n,表示有n个整数。 第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。 【输出】 输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。 【输入样例】 4 344 222 343 222 【输出样例】 1131 282.75000 代码 #include<cstdio> using namespace std; int n,m,i,t; double s=0; int main() { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&m); s=s+m; } t=s; printf("%d",t); printf(" %.5lf",s/n); return 0; } 文章来源: https://blog.csdn.net/zsbailong/article/details/90741254

信息学奥赛C++语言:均值

匿名 (未验证) 提交于 2019-12-02 23:36:01
【题目描述】 给出一组样本数据,包含n个浮点数,计算其均值,精确到小数点后4位。 【输入】 输入有两行,第一行包含一个整数n(n小于100),代表样本容量;第二行包含n个绝对值不超过1000的浮点数,代表各个样本数据。 【输出】 输出一行,包含一个浮点数,表示均值,精确到小数点后4位。 【输入样例】 2 1.0 3.0 【输出样例】 2.0000 代码 #include<cstdio> using namespace std; int n,i; double s=0,m; int main() { scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%lf",&m); s=s+m; } printf(" %.4lf",s/n*1.0); return 0; } 文章来源: https://blog.csdn.net/zsbailong/article/details/90741235