acm算法经典例题

一、数论

1: Wolf and Rabbit

描述

There is a hill with n holes around. The holes are signed from 0 to n-1.

A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m holes. For example, m=2 and n=6, the wolf will get into the holes which are signed 0,2,4,0. If the rabbit hides in the hole which signed 1,3 or 5, she will survive. So we call these holes the safe holes.

输入

The input starts with a positive integer P which indicates the number of test cases. Then on the following P lines,each line consists 2 positive integer m and n(0

输出

For each input m n, if safe holes exist, you should output "YES", else output "NO" in a single line.

样例输入

2

1 2

2 2

样例输出

NO

YES

翻译:

描述

一座山有n个洞,洞被标记为从0到n-1。兔子必须藏在一个洞中。狼会逆时针方向搜索兔子。狼一开始在洞0,然后他会每m个洞进去一次。例如:m=2,n=6,狼就会依次进入洞0 2 4 0。如果兔子藏在1 3 5就安全。

输入

第一行一个数字p,表示下面有p组测试数据,每组测试数据2个数m n(0

输出

每组数据输出一行,如果存在安全洞穴,输出"YES",否则输出"NO"

思路/方法:你是不是觉得总是无法通过,看看下面的解析

假设有n=6个洞 0 1 2 3 4 5

当m=4时,狼进的洞是0 4 2 0,也就是形成了一个循环,永远也到不了其他洞穴

当m=5时,狼进的洞是0 5 4 3 2 1 0,这时所有的洞都遍历了一遍。

思考:当m=4和m=5时,到底有什么区别?

当n和m有公约数(非1)时,就会形成一个数字个数小于n的循环

当n和m无公约数时,就会形成一个数字个数为n的循环,此时没有安全洞穴。

解题关键:这题就转化成了判断两个数是否有公约数。

代码:

#include

using namespace std;

long long greatestCommonDivisor(long long a, long long b)//最大公约数

{

long long t;

while(b)

{

return a;

}

int main()

{

int i, p;

long long m, n;

cin >> p;

for(i = 0; i < p; i++)

{

cin >> m >> n;

if(greatestCommonDivisor(m, n) == 1)//公约数为1说明互斥,没有安全洞穴

cout << "NO\n";

else

cout << "YES\n";

}

return 0;

}

2: a^b

描述

给定a和b,输出a^b的最后一个数字。

输入

输入数据有多组,每组数据占一行,每行为a和b的值(0

输出

对每组输入数据,输出a^b的最后一位数字,每组数据占一行。

样例输入

2 2

3 4

样例输出

4

1

思路/方法:如果你模拟a^b次肯定会超时,而且数字还会超出Int范围

题目说只要最后一个数字,回想一下小学时学的乘法过程,貌似乘数最后一位和前面的无关

我们大胆的尝试一下用a的个位代替a,然后我们发现循环b次还是会超时,这是我们要想办法减少循环的次数,试一下是不是有周期规律

这时我们来列举一下2的n次方的个位:2 4 8 6 2 4 8 6

我们发现周期为4,我们在试试1-9的n次方,发现周期都是4,所以,我们可以用b%4代替b,需要注意的是,当b%4==0时,我们需要给他加上4,不然就不循环了。

代码:

#include

int main()

{

int a, b, i, t;

while(scanf("%d %d", &a, &b) != EOF)

{

b = b % 4;

for(i = 0; i < b; i++)

{

t = t * a;

t = t % 10;

}

printf("%d\n", t);

}

return 0;

}

3: 筛选法求素数

描述

请使用筛选法输出[a, b]之间的所有素数。

输入

输入数据有多组,每组数据占一行,每行2个正整数a和b,其中2<=a<=b<=1000000。

输出

每组数据按从小到大的顺序输出[a, b]中所有的素数,每行最多输出10个素数。每组数据之后空一行。

样例输入

2 3

2 50

样例输出

2 3

2 3 5 7 11 13 17 19 23 29

31 37 41 43 47

思路/方法:这题测试的数据量很大,所以尽量少循环,尽量少判断,要非常精简才能通过。

1.定义一个全局变量short s[1000001];//全局变量默认为0

2.把数组中下标为奇数的值改为1,偶数不用改,因为除了2,其他偶数都不是素数

s[2] = 1;//2也是素数

for(i = 3; i < 1000001; i = i + 2)//把奇数全部假设为素数

s[i] = 1;

3.把素数的倍数挖掉,改为0。(从2开始到根号1000000之间的素数的倍数挖掉)

for(i = 2; i < 1000; i++)//小于根号1000000

if(s[i])//判断是否为素数,只有素数的倍数才挖掉

for(j = i * 2; j < 1000001; j = j + i)//把i的倍数的值改成0

s[j] = 0;

4.最后一点是输出格式,每组之间一个空行,另外一行最多10个。定义一个变量来记录输出了多少个,达到十个就输出换行。具体看代码。

代码:

#include

short s[1000001];//全局变量默认为0

int main()

{

int t, a, b, i, j;

s[2] = 1;//2也是素数

for(i = 3; i < 1000001; i = i + 2)//把奇数全部假设为素数

s[j] = 0;

while(scanf("%d %d", &a, &b) != EOF)

{

t = 0;

for(i = a; i <= b; i++)

{

if(s[i])//素数就输出

{

if(t)

if(t == 10)

{

printf("\n");

t = 0;

}

else

printf(" ");

t++;

printf("%d", i);

}

}

printf("\n\n");

}

return 0;

}

4: The ones to remain

描述

There are N soldiers standing in one line. They are marked from 1 to N, from right to left. And they are given a number m. Then the soldiers numbered off, straight from the right-hand man. The one who reported a number that is the multiple of m was kept in the line. Others have to leave the line. They continue doing this till the number of people in the line is less than m. For example, if there are 10 soldiers, and m = 3. For the first time the soldiers who are marked 3, 6, 9 remain in the line. For the second time the soldier who is marked 9 remains in the line. Because the number of soldiers in the line is less than m, so the soldier marked 9 was the only one to remain in the line.

Now we want to know who will be the ones to remain, can you tell us ?

输入

There are several test cases in the input. Each test cases is only one line, contains two integers n and m.(3 <= n <= 109, 2 <= m <= n). The input ends when n = 0 and m = 0.

输出

For each test case, output two lines. The first line contains one integer x, the number of soldiers to remain. The second line contains x integers, the numbers marked on the soldiers who remain in the line. You should output them in increasing order.

样例输入

10 3

8 3

0 0

样例输出

1

9

有N个士兵站在一行。他们被从右到左标记为1到N。他们被给与了一个数字m。然后士兵直接从右面报数。报的数是m的倍数的留下来,其他人离开。然后继续上述操作,直到人数少于m。例如,有10个士兵,m=3。第一次士兵报数为3 6 9的留下,第二次士兵报数为9的留下。

输入

有多组测试数据。每组一行两个数n m(3 <= n <= 109, 2 <= m <= n),以0 0结束

输出

每组输出两行,第一行输出一个x表示留下来的士兵数量,第二行输出x个留下来的士兵的编号。

思路/方法:

这题用数组来存储士兵状态就会超时,所以我们需要更精简的算法,很明显可以看出这是道数学题,所以我们多举几个例子,看看是否有规律。

m=2时

1 2

2

1 2 3

2

1 2 3 4

2 4

4

1 2 3 4 5 6

2 4 6

4

1 2 3 4 5 6 7 8

2 4 6 8

4 8

8

m=3时

1 2 3

3

1 2 3 4

3

1 2 3 4 5 6

3 6

1 2 3 4 5 6 7 8 9

3 6 9

9

由上面的几个例子可以看出关键是找到一个不大于n的最大的m^x。比如m=2的时候,依次是2^1 2^1 2^2 2^2 2^3,当x一样时,他们的结果值一样,并且就是m^x。

如上,当m=4时,只有m^1不大于n,所以结果第一个数为4,然后后面有8 12为4的倍数,且不大于n,所以得到3个结果,和例子的结果一致。

这样就成功推出了解题方法,虽然不严谨,但作为一般人,能做出来就行了。

代码:

#include

using namespace std;

int main()

{

long long m, n, remain, id, j;//id表示下标,j表示当前第几个报数

while(cin >> n >> m, !(n == 0 && m == 0))

{

//得到不大于n的 m^x 的值

j = 1;

for(id = 1;; id++)

{

j = j * m;

if(j * m > n)

break;

}

remain = 0;

for(id = 1;;id++)

{

if(j * id <= n)//得到不大于n的 m的倍数的个数

remain++;

else

break;

}

cout << remain << endl;

for(id = 1; id < remain; id++)

cout << id * j << " ";

cout << id * j << endl;

}

return 0;

}

5: 小数化分数

描述

Ray 在数学课上听老师说,任何小数都能表示成分数的形式,他开始了化了起来,很快他就完成了,但他又想到一个问题,如何把一个循环小数化成分数呢?

请你写一个程序不但可以将普通小数化成最简分数,也可以把循环小数化成最简分数。

输入

第一行是一个整数N,表示有多少组数据。

每组数据只有一个纯小数,也就是整数部分为0。小数的位数不超过9位,循环部分用()括起来。

输出

0.32(692307)

样例输出

4/9

1/2

17/52

思路/方法:这题需要有个数学转化方法,小编看了别人的纯循环小数转分数的方法,然后又花了点时间推出了非纯循环小数转分数方法,下面分享一下。

1.有限小数:

分子分母乘以10的次方,使得没有小数位,然后分子分母分别除以最大公约数就化简完成。比如0.4,就是0.4*10/10,最大公约数为2,化简后就是2/5

2.纯循环小数

乘以10的次方使得循环部分没有小数位,然后用该数-原数=整数部分。

所以分数形式=循环节/9...9(9的个数等于循环节数字个数)

例如:0.44..,0.444..*10-0.444..=4。所以(10-1)*0.44..=4。0.44..=4/9。

3.非纯循环小数

乘以10的次方使得循环部分没有小数位记为a*10^x,乘以10的次方使得非循环部分没有小数记为a*10^y,则a*10^x-a*10^y就消去了后面的小数。比如:0.2433..*1000-0.243..*100=243-24,所以0.243..=(243-23)/(1000-100),然后总结之后得出下面的结论。不循环部分和循环节构成的的数减去不循环部分的差,再除以循环节位数个9,添上不循环部分的位数个0。比如:

0.24333333…………=(243-24)/900=73/300

0.9545454…………=(954-9)/990=945/990=21/22

方法有了,代码也容易写,但小编做的时候犯了一个错误,把循环部分和非循环部分全都当成整数来接受,导致丢失了位数,使得分母不准确了。比如0.001(02)这样的,当成整数接受,非循环部分是1,算长度的时候直接算就是1,循环部分接受后变成2,算长度是1,导致分母变成了90,而实际上是99000。所以必须用字符串来存储,具体看代码了。

代码:

#include

#include

long long greatestCommonDivisor(long long a, long long b)

{

long long t;

while(b)

{

t = a % b;

a = b;

b = t;

}

return a;

}

int main()

{

int i, n, j, k;

long long denominator, numerator, divisor, cyclical, nonCyclical;//分母分子,非循环部分和循环部分

char a[20], nonCyclicalString[20], cyclicalString[20];//必须用文本,否则会丢失位数,比如0.001010这样的会把0丢了 scanf("%d ", &n);

for(i = 0; i < n; i++)

{

if(a[0] == '(')//如果是纯循环小数

{

sscanf(a, "(%s", cyclicalString);//只能这样读取,把括号补充完整也一样的结果

cyclicalString[strlen(cyclicalString) - 1] = '\0';//手动删除后面的括号。读取到了循环部分 sscanf(cyclicalString ,"%I64d", &cyclical);

nonCyclicalString[0] = '\0';

numerator = cyclical;//分子就等于循环节

}

else

{

for(j = 0; a[j] != '('; j++)//读取到(就停止。读取非循环部分

nonCyclicalString[j] = a[j];

nonCyclicalString[j] = '\0';

for(k = 0, j = j + 1; a[j] != ')'; j++, k++)//从(右边一个开始读取到)就停止。读取循环部分 cyclicalString[k] = a[j];

cyclicalString[k] = '\0';

sscanf(nonCyclicalString, "%I64d", &nonCyclical);//把非循环部分的值放入到变量中

sscanf(cyclicalString, "%I64d", &cyclical);//把循环部分的值放入到变量中

numerator = nonCyclical;//把分子的值先变成非循环部分

for(j = 0; cyclicalString[j] != '\0'; j++)//往分子尾部加入循环节部分

{

numerator = numerator * 10 + (cyclicalString[j] - '0');

}

numerator = numerator - nonCyclical;//非循环部分和循环部分的组合 - 非循环部分

}

//计算分母

denominator = 0;

for(j = 0; cyclicalString[j] != '\0'; j++)//加上循环节个数个9

denominator = denominator * 10 + 9;

for(j = 0; nonCyclicalString[j] != '\0'; j++)//加上非循环部分个0

denominator = denominator * 10;

divisor = greatestCommonDivisor(numerator, denominator);

printf("%I64d/%I64d\n", numerator / divisor, denominator / divisor);

}

else//非循环小数

{

sscanf(a, "%I64d", &numerator);//把小数部分存到变量中

denominator = 1;

for(j = 0; a[j] != '\0'; j++)//计算分母

denominator = denominator * 10;

divisor = greatestCommonDivisor(numerator, denominator);

printf("%I64d/%I64d\n", numerator / divisor, denominator / divisor);

}

}

return 0;

}

输入

测试数据有多组,第一行是整数t(0

输出

按递增的顺序输出序列的全排列。每个测试数据后面输出一个空行。

样例输入

1

3

1 3 5

样例输出

1 3 5

1 5 3

3 1 5

3 5 1

5 1 3

5 3 1

思路/方法:全排列有递归和非递归算法,具体网上有,这里我们为了代码简洁,采用STL里面的函数来实现,容易理解,而且好写。首先引用algorithm这个库,然后里面有sort排序函数和next_permutation下一个排列函数。

sort升序排序,参数分别是首地址和末地址

next_permutation是判断是否有下一个排列,有返回true,并且改变数组状态,否则返回false。参数分别是首地址和末地址

代码:

#include

#include

using namespace std;

void display(int a[], int n)

{

int i;

for(i = 0; i < n - 1; i++)

cout << a[i] << " ";

cout << a[i] << endl;

}

void fullPermutation(int a[], int n)//全排列,STL实现

{

sort(a, a + n);//升序排序

do

{

display(a, n);//显示出来

}while(next_permutation(a, a + n));

}

int main()

{

int i, n, t, j;

cin >> t;

for(i = 0; i < t; i++)

{

cin >> n;

cout << endl;

}

return 0;

}

7: (1+x)^n

描述

Please calculate the coefficient modulo 2 of x^i in (1+x)^n.

输入

For each case, there are two integers n, i (0<=i<=n<=2^31-1)

输出

For each case, print the coefficient modulo 2 of x^i in (1+x)^n on a single line. 样例输入

3 1

4 2

样例输出

1

翻译:

描述

请计算(1+x)^n中x^i的系数对2取模的值

输入

每组测试数据有两个整数n i (0<=i<=n<=2^31-1)

输出

每组输出一行,即对2取模的值

思路/方法:(1 + x)^n展开后x^i项的系数的对2取余

即求 c(n, i)x^i中的c(n, i) % 2的值

如果我们计算组合数在对2取余,就会超时,所以我们需要更简便的算法

既然是对2取模,就是奇偶性咯,所以我们需要一个组合数的奇偶性判断的算法

对于组合数C(n, m) 如果(n&m) == m,那么该组合数是奇数,否则为偶数

代码:

#include

int main ()

{

long long n, i;

while(scanf("%I64d %I64d", &n, &i) != EOF)

if((n&i) == i)//奇数,输出1

printf("1\n");

else

printf("0\n");

return 0;

}

8: Summing divisors

描述

divisors of 4 are 1, 2 and 4 and the positive divisors of 3 are 1 and 3, so S(4/3) = 1/1 + 2/1 + 4/1 + 1/3 + 2/3 + 4/3 = 28/3.

输入

Each line of input will be of the form a/b (with no white space) where a and b are integers in the range from 1 to 16000. 输出

Each line of output is of the form a/b where a and b are integers, and the fraction is in simplest terms (so 1/2 will be output instead of 2/4 for example).

样例输入

6/1

2/3

100/49

样例输出

12/1

4/1

1767/7

翻译:

描述

在18世纪,L. Euler发明了一个功能去研究数字的特性,他称之为sigma。他对比较整数的正因子的和感兴趣。在这个问题我们扩展Euler的功能到分数。

给一个正分数最简形式a/b,我们定义 S(a/b) 是所有整数x/y的和,x/y是正因子组成,x来自a的因子,y来自b的因子。例如,4的正因子是1 2 4;3的正因子是1 3。所以S(4/3) = 1/1 + 2/1 + 4/1 + 1/3 + 2/3 + 4/3 = 28/3。

输入

每行输入a/b,a b范围1到16000.

输出

每行输出S(a/b)的值,分数最简形式。

思路/方法:

1.定义数组a和b分别存储输入的两个数的因子。

2.定义一个结构体用来表示分数

3.定义一个函数用来计算分数相加

4.把a和b因子组合起来的分数累加起来,然后约分为最简。

不太好说,具体看下面代码,不难。

代码:

#include

typedef struct Fraction//分数

{

int numerator;//分子

int denominator;//分母

}fraction;

int greatestCommonDivisor(int a, int b)

{

int t;

while(b)

{

t = a % b;

a = b;

fraction addFraction(fraction * f1, fraction * f2)

{

fraction s;

int divisor;

if(f1->denominator == f2->denominator || f1->numerator == 0)//两数分母相同

{

s.numerator = f1->numerator + f2->numerator;//分子相加

s.denominator = f2->denominator;

}

else

{

s.denominator = f1->denominator * f2->denominator;//分母通分

s.numerator = f1->numerator * f2->denominator + f2->numerator * f1->denominator;//分子通分后相加 divisor = greatestCommonDivisor(s.numerator, s.denominator);//求最大公约数

//约分

s.numerator /= divisor;

s.denominator /= divisor;

}

return s;

}

int main()

{

int a[16001], b[16001], i, j, ca, cb;

fraction s, t;

while(scanf("%d/%d", a, b) != EOF)//把a和b存到a0 b0

{

ca = cb = 1;

for(i = 1; i <= a[0]; i++)//a的所有因子

{

if(a[0] % i == 0)

{

a[ca] = i;

ca++;

}

}

for(i = 1; i <= b[0]; i++)//b的所有因子

{

if(b[0] % i == 0)

{

b[cb] = i;

cb++;

}

}

s.denominator = s.numerator = 0;

for(i = 1; i < cb; i++)//计算因子组合的和

{

for(j = 1; j < ca; j++)

{

int divisor = greatestCommonDivisor(s.numerator, s.denominator);//求最大公约数

//约分

s.numerator /= divisor;

s.denominator /= divisor;

printf("%d/%d\n", s.numerator, s.denominator);

}

return 0;

}

9: 简单组合问题

描述

对于有m个元素的集合,在元素能重复取的情况下,我们可以得到有r组合的集合;例如,当m=2,r=4时,集合{a,b}可以划分为5个不同的r组合的集合:

{a,a,a,a};

{a,a,a,b};

{a,a,b,b};

{a,b,b,b};

{b,b,b,b};

输入

输入数据有多组,每行输入2个整型数据m,r,(0

输出

输出可以划分的集合个数

样例输入

2 4

样例输出

5

思路/方法:题目指明了是组合问题,就是不考虑顺序。

这题输入的数据范围小,说明不是有公式就能得出答案的,需要经过推算。

我们不妨来举个例子来看一下是否有规律。

当m=1是,结果都是1

当m=3,r=4时,假设有a,b,c三种数,a就有5(即r+1)种情况,集合中a的个数可以为0 1 2 3 4。a=0时,就剩下b,c来充满4个位置,这种情况的值与m=2,r=4时的值一样;a=1时,就剩下b,c来充满3个位置,这种情况的值与m=2,r=3时的值一样;a=2时,就剩下b,c来充满2个位置,这种情况的值与m=2,r=2时的值一样;a=3时,就剩下b,c来充满1个位置,这种情况的值与m=2,r=1时的值一样;a=4时,位置充满了,值为1。

通过上面例子我们发现s(m=3,r=4)可以转化成s(m=2,r=4) + s(m=2,r=3) + s(m=2,r=2) + s(m=2,r=1) +1。

同样的,我们推广出来就是s(m,r)=s(m-1,r)+s(m-1,r-1)+s(m-1,r-2)+.....+s(m-1,1)+1。

也就是s(m,r)可以转化成前一行的前r列的和+1。

有了这个规律,我们只要知道第一行,就能退出后面的。

这题用递归会超时,所以我们用递推,具体代码如下。

代码:

#include

long long a[21][21];

int main()

{

int m, r, i;

for(i = 0; i < r; i++)//循环r次

a[m][r] = a[m][r] + a[m - 1][r - i];

a[m][r] = a[m][r] + 1;

}

while(scanf("%d %d", &m, &r) != EOF)

printf("%I64d\n", a[m][r]);

return 0;

}

10: GCD & LCM

描述

Given x and y (2 <= x <= 100,000, 2 <= y <= 1,000,000), you are to count the number of p and q such that:

1) p and q are positive integers;

2) GCD(p, q) = x;

3) LCM(p, q) = y.

输入

There are multiple test cases, each case contains two integers x and y, one line for each test case.

输出

Number of pairs of p and q.

样例输入

3 60

样例输出

4

翻译:

描述

给定x,y(2 <= x <= 100,000, 2 <= y <= 1,000,000),你要像下面那样计算出p和q:

1) p,q是正整数;

2) GCD(p, q) = x;即p,q的最大公约数是x

3) LCM(p, q) = y.即p,q的最小公倍数是y

输入

输入多组测试数据,每组包含两个整数x y

输出

每组输出满足条件的p和q的组数。

思路/方法:

我们要求p,q可能的组数,先来推一下x y p q之间的关系

最小公倍数=两数之积/最大公约数。也就是y=p*q/x;

所以得到xy=pq (范围:x <= p,q <= y)

因为p和q可以用最大公约数的倍数来表示,即设p=x*n1,q=x*n2。

我们可以得到p*q=x*x*n1*n2=x*y。即n1*n2=y/x。

还可以得到gcd(p,q)=gcd(x*n1,x*n2)=x

因此gcd(n1,n2)=1也就是n1,n2是互质的数 (范围:1 <=n1,n2 <= y/x)

所以,确定n1,n2就确定了p,q,我们只需要知道这样的n1,n2有多少组,就知道有多少组p,q

代码:

#include

int gcd(int a, int b)//最大公约数

t = a % b;

a = b;

b = t;

}

return a;

}

int main()

{

int x, y, i, c, s;

while(scanf("%d %d", &x, &y) != EOF)

{

if(y % x != 0)//如果发现最小公倍数不是最大公约数的倍数,就说明组数为0

{

printf("0\n");

continue;

}

c = 0;

s = y / x;

for(i = 1; i <= s; i++)

if(s % i == 0)//能除尽,因为 n1*n2=y/x=s。这里是用i表示n1,s/i表示n2

if(gcd(i, s / i) == 1)//判断n1和n2是否互质

c++;

printf("%d\n", c);

}

return 0;

}

11: Raising Modulo Numbers(快速取模)

描述

People are different. Some secretly read magazines full of interesting girls' pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing research shows, that this market segment was so far underestimated and that there is lack of such games. This kind of game was thus included into the KOKODDáKH. The rules follow:

Each player chooses two numbers Ai and Bi and writes them on a slip of paper. Others cannot see the numbers. In a given moment all players show their numbers to the others. The goal is to determine the sum of all expressions AiBi from all players including oneself and determine the remainder after division by a given number M. The winner is the one who first determines the correct result. According to the players' experience it is possible to increase the difficulty by choosing higher numbers.

You should write a program that calculates the result and is able to find out who won the game.

输入

The input consists of Z assignments. The number of them is given by the single positive integer Z appearing on the first line of input. Then the assignements follow. Each assignement begins with line containing an integer M (1 <= M <= 45000). The sum will be divided by this number. Next line contains number of players H (1 <= H <= 45000). Next exactly H lines follow. On each line, there are exactly two numbers Ai and Bi separated by space. Both numbers cannot be equal zero at the same time.

输出

For each assingnement there is the only one line of output. On this line, there is a number, the result of expression (A1B1 + A2B2 + ... + AHBH) mod M.

2 3

3 4

4 5

5 6

36123

1

2374859 3029382

17

1

3 18132

样例输出

2

13195

13

翻译:

描述

人们都不同。有些人私下的看满是令人感兴趣的美女图片的杂志,一些人在他们地下室造炸弹,一些人喜欢使用窗户,一些人喜欢复杂的数学游戏。最新的市场调查表明,市场部分太过低估,缺乏这样的游戏。这种游戏是这样的包含在KOKODDáKH。规则如下:

每个玩家选择两个数字Ai 和 Bi,在光滑的纸上写下他们。其他人不能看见这些数字,在给定的时间所有的玩家展示他们的数字给别人看。目标是决定所有的表达式AiBi的和对M取模。第一个得出答案的是胜利者。根据玩家的表达式,很有可能通过选择大的数来增加难度。

你应该写一个程序来计算结果,并且能够造出是谁赢家。

输入

第一行输入一个整数z表示有z组测试数据。每组数据第一行是一个整数M(1 <= M <= 45000)。所有表达式的和对M取模。下一行是玩家个数H(1<=H<=45000)。下面H行是每个玩家的两个数字Ai Bi,两个数不会同时为0

输出

每组数据输出一行表达式(A1B1 + A2B2 + ... + AHBH) mod M.的结果。

思路/方法:如果找常规方法算即使是64位整数也不够存储,所以我们需要快速取模的算法。这算法推起来不简单,这里就不讲为什么,记住这么做就行,下面代码也有注释,至少能保证你看得懂代码,至于为什么这么写,可以百度“快速取模”。

代码:

#include

long long quickMod(long long a, long long b, int m)//a的b次方对 m取模

{

long long s = 1;

while(b)//b次方就循环b次

{

if(b&1)//等价于b%2,如果b是奇数

{

s = s * a % m;//乘以a后对m取模

b--;

}

a = a * a % m;

b >>= 1;//等价于b/= 2

}

return s;

long long s, a, b;

scanf("%d", &z);

for(i = 0; i < z; i++)

{

s = 0;

scanf("%d", &m);

scanf("%d", &h);

for(j = 0; j < h; j++)

{

scanf("%I64d %I64d", &a, &b);

s = s + quickMod(a, b, m);

s = s % m;

}

printf("%I64d\n", s);

}

return 0;

}

12: Euclid's Game(简单博弈论)

描述

Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser of the two numbers from the greater of the two numbers, provided that the resulting number must be nonnegative. Then Ollie, the second player, does the same with the two resulting numbers, then Stan, etc., alternately, until one player is able to subtract a multiple of the lesser number from the greater to reach 0, and thereby wins. For example, the players may start with (25,7):

25 7

11 7

4 7

4 3

1 3

1 0

an Stan wins.

输入

The input consists of a number of lines. Each line contains two positive integers giving the starting two numbers of the game. Stan always starts.

输出

For each line of input, output one line saying either Stan wins or Ollie wins assuming that both of them play perfectly. The last line of input contains two zeroes and should not be processed.

样例输入

34 12

15 24

0 0

样例输出

Stan wins

Ollie wins

翻译:

描述

11 7

4 7

4 3

1 3

1 0

Stan赢了。

输入

输入多组测试数据,每组一行两个正整数,Stan总是第一个开始。

输出

每组数据输出一行,谁赢了比赛。输入两个0 0就不处理结束运行。

思路/方法:这题还是需要找规律。

我们假设a<=b,如果a>b就交换a b。

1.很明显,如果a或者b为1,则Stan必胜。如果a==b则Stan也必胜。

2.如果b==2*a,显然Stan必胜。如果b>2*a,我们可以假设b%a=c,(c

如果(c,a)是必败态,则Stan肯定会将b减成c,这时是O面临此种情况,可使得O必败。如果(c,a)是必胜态,则S可减b,使得b(要知道b>2*a啊,那就是说b=n*a+c,其中n>=2)成为a+c,局面成为(a,a+c),这是O只有一种选择,那就是将a+c减一个a(仔细想想,按照游戏规则,他真的没别的办法了),局面变成了Stan面临的(c,a)是一种必胜态,也就是说,当b>2*a的时候,无论(c,a)是必胜态还是必败态,S都必胜。

3.如果a< b < 2 * a。这时只有一种选择,但我们仍然不知道是否能赢,所以我们用递归就行了,注意递归(b-a, a)时下一个状态,即对手的状态,所以我们要取反才是自己的状态。

上面就包含了所有的情况,同样的当a > b时,也是一样的,选手是从中选择一个大的数减去小的,所以谁大无所谓。

代码:

#include

void swap(long long * a, long long * b)

{

long long t;

t = *a;

*a = *b;

*b = t;

}

int game(long long a, long long b)

{

if(a > b)//保证b较大

swap(&a, &b);

if(a == b || b >= 2 * a)

return 1;

else

return !game(b - a, a);//下一个状态是对手状态,对手赢了自己就输了,所以需要加一个!才是自己的状态

}

int main()

{

long long a, b;

while(scanf("%I64d %I64d", &a, &b), !(a == 0 && b == 0))

if(game(a, b))

printf("Stan wins\n");

else

二.几何基础

1: 求两直线的夹角

描述

有两条直线,AB和CD,A、B、C、D的坐标已知,求这两条直线的所成夹角中较小的一个。

输入

输入包括多组数据,第一行为测试数据的组数n,接下来后面有n行,每一行有8个整数,依次代表A点的x坐标、A点的y坐标,B 点的x坐标、B点的y坐标,C点的x坐标、C点的y坐标,D点的x坐标、D点的y坐标。

输出

输出夹角的近似值(角度值而非弧度值,保留1位小数)。

样例输入

2

0 0 0 1 0 0 1 0

0 0 1 1 1 1 1 0

样例输出

90.0

45.0

思路/方法:两直线夹角等价于求两直线的向量的夹角。即cos=n1*n2/(|n1|*|n2|),两向量点积 / 两向量模 = 角的余弦值然后把余弦值转化成弧度再转化成角度。acos函数就是arccos。

代码:

#include

#include

int main()

{

int a[8], n, i, j, x1, x2, y1, y2;//两个向量(x1,y1)(x2,y2)

double angle;//角度

scanf("%d", &n);

for(i = 0; i < n; i++)

{

for(j = 0; j < 8; j++)

scanf("%d", a + j);//输入到数组中

x1 = a[2] - a[0];

y1 = a[3] - a[1];

x2 = a[6] - a[4];

y2 = a[7] - a[5];

angle = fabs((x1 * x2 + y1 * y2) / (sqrt(x1 * x1 + y1 * y1) * sqrt(x2 * x2 + y2 * y2)));//cos=n1*n2/(|n1|*|n2|) angle = acos(angle) / 3.1415926 * 180;//arccos反三角求弧度,转成度数先除以π,在乘以180

printf("%.1lf\n", angle);

}

return 0;

}

2: 计算几何练习题——线段相交

描述

线段相交测试在计算几何中是经常用到的,给定线段P1P2(P1和P2是线段的两端点,且不重合)、P3P4(P3和P4是线段的两端点,且不重合),判断P1P2和P3P4是否相交。P1P2和P3P4不重合,即指只存在一个点P,它既落在P1P2上又落在P3P4上(含线段的端

1

0 0 1 1

2 2

3 3

表示P1、P2、P3、P4的坐标分别为:P1(0,0),P2(1,1),P3(2,2),P4(3,3)

输出

判断每组数据中的线段P1P2和P3P4是否相交,如果相交输出YES,否则输出NO。每组数据输出占一行。

样例输入

1

0 0 1 1

2 2

3 3

样例输出

NO

思路/方法:判断线段相交,我这里介绍一种常见的方法。

快速排斥(两个由线段做对角线的矩形是否有交集) + 跨立(一个线段的两个端点在另一线段的两端)

判断是否有交集就是把所有不相交的情况取反,也就是

!( max(p1.x, p2.x) < min(p3.x, p4.x) || max(p3.x, p4.x) < min(p1.x, p2.x) || max(p1.y, p2.y) < min(p3.y, p4.y) || max(p3.y, p4.y) < min(p1.y, p2.y) )

判断跨立就是(AC X AB) * (AD X AB) <= 0 && (CA X CD) * (CB X CD) <= 0

叉乘X的公式是p1 X p2 = p1.x * p2.y - p1.y * p2.x

所以代码就好写了。

代码:

#include

#include

using namespace std;

class point

{

public:

double x, y;

point(double x1, double y1)

{

x = x1;

y = y1;

}

};

class line

{

public:

point n;

line(point & p1, point &p2): n(p2.x - p1.x, p2.y - p1.y){}

friend double X(line & l1, line & l2);//叉乘

};

double X(line & l1, line & l2)//叉乘

{

return l1.n.x * l2.n.y - l1.n.y * l2.n.x;

}

inline double min(double a, double b)

统计学经典习题集参考答案

1.要了解某班50名学生的性别构成情况,则总体是()。 A.每一个学生 B.每一个学生的性别 C.全体学生 D.全体学生的性别 2.要了解全国的人口情况,总体单位是()。 A.每一个人 B.每一户 C.每个省的人口 D.全国总人口 3.某班四名学生金融考试成绩分别为70分、80分、86分和90分,这四个数字是()。 A.变量值 B.标志 C.指标值 D.指标 4.工业企业的职工人数、职工工资是()。 A.离散变量 B.前者是离散变量,后者是连续变量 C.连续变量 D.前者是连续变量,后者是离散变量 5.统计学与统计工作的关系是()。 A.理论与应用的关系 B.工作与结果的关系 C.理论与实践的关系 D.工作与经验的关系 6.某地区为了掌握该地区水泥生产的质量情况,拟对占该地区水泥总产量的90%的五个大型水泥厂的生产情况进行调查,这种调查方式是()。 A.典型调查 B.重点调查 C.抽样调查 D.普查 7.某地进行国有商业企业经营情况调查,则调查对象是()。 A.该地所有商业企业 B.该地所有国有商业企业 C.该地每一家商业企业 D.该地每一家国有商业企业 8.对企业先按经济类型分组,再按企业规模分组,属于()。 A.简单分组 B.平行分组 C.复合分组 D.再分组 9.某变量数列,其末组为开口组,下限为600,又知其相邻组的组中值为550,则末组的组中值是()。 A.100 B.500 C.650 D.700 10.统计表的宾词是用来说明总体特征的()。 A.统计指标 B.总体单位 C.标志 D.统计对象 11.下面属于时期指标的是()。 A.商品销售额 B.商场数量 C.商品价格 D.营业员人数 12.用水平法检查长期计划完成程度,应规定()。 A.计划期初应达到的水平 B.计划期末应达到的水平 C.计划期中应达到的水平 D.整个计划期应达到的水平 13.第五次人口普查结果,我国每10万人中具有大学程度的为3611人。该数字资料为()。 A.绝对数 B.结构相对数 C.比较相对数 D.强度相对数 14.某商场计划11月份销售利润比10月份提高2%,实际提高了3%,则销售利润计划完成程度为()。 A.100.98% B.95.10% C.99.00% D.105.10% 15.平均数反映了()。 A.总体分布的集中趋势 B.总体分布的离中趋势 C.总体中各单位分布的集中趋势 D.总体变动的趋势 16.中位数和众数是一种()。 A.常见值 B.代表值 C.实际值 D.典型值 17.计算发展速度的分母是()。 A.计划期水平 B.固定期水平 C.报告期水平 D.基期水平 18.由一个10项的时间序列可以计算的环比发展速度有()。 A.8个 B.9个 C.10个 D.11个

贪心算法经典例题

贪心算法经典例题 发布日期:2009-1-8 浏览次数:1180 本资料需要注册并登录后才能下载! ·用户名密码验证码找回密码·您还未注册?请注册 您的账户余额为元,余额已不足,请充值。 您的账户余额为元。此购买将从您的账户中扣除费用0.0元。 内容介绍>> 贪心算法经典例题 在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。 从贪心算法的定义可以看出,贪心法并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。 我们看看下面的例子 例1 均分纸牌(NOIP2002tg) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如 N=4,4 堆纸牌数分别为: ①9 ②8 ③17 ④ 6 移动3次可达到目的: 从③取 4 张牌放到④(9 8 13 10) -> 从③取 3 张牌放到②(9 11 10 10)-> 从②取 1 张牌放到①(10 10 10 10)。 [输入]:键盘输入文件名。 文件格式:N(N 堆纸牌,1 <= N <= 100) A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) [输出]:输出至屏幕。格式为:所有堆均达到相等时的最少移动次数。 [输入输出样例] a.in: 4 9 8 17 6 屏慕显示:3 算法分析:设a[i]为第i堆纸牌的张数(0<=i<=n),v为均分后每堆纸牌的张数,s为最小移到次数。 我们用贪心法,按照从左到右的顺序移动纸牌。如第i堆(0

数值计算方法试题及答案

【 数值计算方法试题一 一、 填空题(每空1分,共17分) 1、如果用二分法求方程043=-+x x 在区间]2,1[内的根精确到三位小数,需对分( )次。 2、迭代格式)2(2 1-+=+k k k x x x α局部收敛的充分条件是α取值在( )。 3、已知?????≤≤+-+-+-≤≤=31)1()1()1(211 0)(2 33x c x b x a x x x x S 是三次样条函数, 则 a =( ), b =( ), c =( )。 4、)(,),(),(10x l x l x l n 是以整数点n x x x ,,,10 为节点的Lagrange 插值基函数,则 ∑== n k k x l 0)(( ), ∑== n k k j k x l x 0 )(( ),当2≥n 时 = ++∑=)()3(20 4x l x x k k n k k ( )。 ; 5、设1326)(2 47+++=x x x x f 和节点,,2,1,0,2/ ==k k x k 则=],,,[10n x x x f 和=?07 f 。 6、5个节点的牛顿-柯特斯求积公式的代数精度为 ,5个节点的求积公式最高代数精度为 。 7、{}∞ =0)(k k x ?是区间]1,0[上权函数x x =)(ρ的最高项系数为1的正交多项式族,其中1)(0=x ?,则?= 1 4)(dx x x ? 。 8、给定方程组?? ?=+-=-2211 21b x ax b ax x ,a 为实数,当a 满足 ,且20<<ω时,SOR 迭代法收敛。 9、解初值问题 00 (,)()y f x y y x y '=?? =?的改进欧拉法 ??? ??++=+=++++)],(),([2),(] 0[111] 0[1n n n n n n n n n n y x f y x f h y y y x hf y y 是 阶方法。

统计与概率经典例题(含答案和解析).docx

统计与概率经典例题(含答案及解析) 1.(本题8 分)为了解学区九年级学生对数学知识的掌握情况,在一次数学检测中, 从学区2000 名九年级考生中随机抽取部分学生的数学成绩进行调查,并将调查结果绘 制成如下图表: ⑴表中 a 和 b 所表示的数分别为:a= .,b=.; ⑵请在图中补全频数分布直方图; 2000 名九年级考生数学⑶如果把成绩在70 分以上(含70 分)定为合格,那么该学区 成绩为合格的学生约有多少名? 2.为鼓励创业,市政府制定了小型企业的优惠政策,许多小型企业应运而生,某镇统 计了该镇 1﹣ 5 月新注册小型企业的数量,并将结果绘制成如下两种不完整的统计图: ( 1)某镇今年1﹣5 月新注册小型企业一共有家.请将折线统计图补充完整; ( 2)该镇今年 3 月新注册的小型企业中,只有 2 家是餐饮企业,现从 3 月新注册的小型企业中随机抽取 2 家企业了解其经营状况,请用列表或画树状图的方法求出所抽取的 2家企业恰好都是餐饮企业的概率. 3.( 12 分)一个不透明的口袋装有若干个红、黄、蓝、绿四种颜色的小球,小球除颜 色外完全相同,为估计该口袋中四种颜色的小球数量,每次从口袋中随机摸出一球记下颜 色并放回,重复多次试验,汇总实验结果绘制如图不完整的条形统计图和扇形统计图.

根据以上信息解答下列问题: (1)求实验总次数,并补全条形统计图; (2)扇形统计图中,摸到黄色小球次数所在扇形的圆心角度数为多少度? (3)已知该口袋中有 10 个红球,请你根据实验结果估计口袋中绿球的数量. 4.(本题 10 分)某校为了解2014 年八年级学生课外书籍借阅情况,从中随机抽取了 40名学生课外书籍借阅情况,将统计结果列出如下的表格,并绘制成如图所示的扇形 统计图,其中科普类册数占这40 名学生借阅总册数的40%. 类别科普类教辅类文艺类其他册数(本)12880m48 ( 1)求表格中字母m的值及扇形统计图中“教辅类”所对应的圆心角 a 的度数; (2)该校 2014 年八年级有 500 名学生,请你估计该年级学生共借阅教辅类书籍约多少本? 5.( 10 分)将如图所示的版面数字分别是1, 2,3, 4 的四张扑克牌背面朝上,洗匀后放在桌面上(“ A”看做是“ 1”)。 ( 1)从中随机抽出一张牌,牌面数字是偶数的概率是;(3分) ( 2)从中随机抽出两张牌,两张牌面数字的和是 5 的概率是;(3分)(3)先从中随机抽出一张牌,将牌面数字作为十位上的数字,然后将该牌放回并重新洗 匀,再随机抽取一张,将牌面数字作为个位上的数字,请用画树形图的方法求组成的

算法习题

算法设计与分析试卷 一、填空题(20分,每空2分) 1、算法的性质包括输入、输出、确定性、有限性。 2、动态规划算法的基本思想就将待求问题分解成若干个子问题、先求解子问题,然后 从这些子问题的解得到原问题的解。 3、设计动态规划算法的4个步骤: (1)找出最优解的性质,并刻画其结构特征。 (2)递归地定义最优值。 (3)以自底向上的方式计算出最优值。 (4)根据计算最优值得到的信息,构造最优解。 4、流水作业调度问题的johnson算法: (1)令N1={i|ai=bj}; (2)将N1中作业依ai的ai的非减序排序;将N2中作业依bi的非增序排序。 5、对于流水作业高度问题,必存在一个最优调度π,使得作业π(i)和π(i+1)满足Johnson不等式min{bπ(i),aπ(i+1)}≥min{bπ(i+1),aπ(i)}。 6、最优二叉搜索树即是最小平均查找长度的二叉搜索树。 二、综合题(50分) 1、当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为∑ak(2<=k<=4)=20(5分) 2、由流水作业调度问题的最优子结构性质可知,T(N,0)=min{ai+T(N-{i},bi)}(1=sum){ sum=thissum; besti=i; bestj=j;} } return sum; } 4、设计最优二叉搜索树问题的动态规划算法OptimalBinarysearchTree? (15分) Void OptimalBinarysearchTree(int a,int n,int * * m, int * * w) { for(int i=0;i<=n;i++) {w[i+1][i]=a[i]; m[i+1][i]= 0;} for(int r=0;r

贪心算法概论

贪心算法概论 贪心算法一般来说是解决“最优问题”,具有编程简单、运行效率高、空间 复杂度低等特点。是信息学竞赛中的一个有为武器,受到广大同学们的青睐。本 讲就贪心算法的特点作些概念上的总结。 一、贪心算法与简单枚举和动态规划的运行方式比较 贪心算法一般是求“最优解”这类问题的。最优解问题可描述为:有n个输入,它的解是由这n 个输入的某个子集组成,并且这个子集必须满足事先给定的条 件。这个条件称为约束条件。而把满足约束条件的子集称为该问题的可行解。这 些可行解可能有多个。为了衡量可行解的优劣,事先给了一个关于可行解的函数,称为目标函数。目标函数最大(或最小)的可行解,称为最优解。 a)求“最优解”最原始的方法为搜索枚举方案法(一般为回溯法)。 除了极简单的问题,一般用深度优先搜索或宽度优先搜索。通常优化方法为利用约束条件进行可行性判断剪枝;或利用目标函数下界(或上界),根据当前最 优解进行分枝定界。 b)其次现今竞赛中用的比较普遍的动态规划(需要满足阶段无后效性原则)。 动态规划主要是利用最最优子问题的确定性,从后向前(即从小规模向大规模)得到当前最优策略,从而避免了重复的搜索。 举例说明:求多段图的最短路径。

在图(1)中,我们省略了各线段的长度。 如果用回溯法,搜索树大致如下: 显然,上面的搜索有大量重复性工作。比如节点8、9、10到11的最短路分别被调用了9次,从节点5、6、7到节点11也分别搜索了3次。 如果先算出节点8、9、10到11的最短路,由于它与前面的点无关,因此最优值确定下来,再用它们求定节点5、6、7 到节点11 的最短路径。同理,再用节 点5、6、7 的最优值,来求节点2、3、4 优值。最后从节点2、3、4 推出1 到 11的最优值。显然复杂度大为降低。 当然,如果本题把简单搜索改为搜索+记忆化的方法,则就是得能动态规划的原理,本质上就是动态规划,只是实现的方法不同与传统的表格操作法。搜索+记忆化算法有其特有的特点,以后再讨论。 c)贪心算法则不同,它不是建立在枚举方案的基础上的。它从前向后,根据当前情况,“贪心地”决定出下一步,从而一步一步直接走下去,最终得到解。 假如上面的例子中,我们定下这样的贪心策略:节点号k%3= =1。则有图3:

C语言经典算法100例题目

看懂一个程序,分三步:1、流程;2、每个语句的功能;3、试数; 小程序:1、尝试编程去解决他;2、看答案;3、修改程序,不同的输出结果; 4、照答案去敲; 5、调试错误; 6、不看答案,自己把答案敲出来; 7、实在不会就背会。。。。。周而复始,反复的敲。。。。。 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? ============================================================== 【程序2】 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高 于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提 成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于 40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于 100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? ============================================================== 【程序3】 题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?============================================================== 【程序4】 题目:输入某年某月某日,判断这一天是这一年的第几天? ============================================================== 【程序5】 题目:输入三个整数x,y,z,请把这三个数由小到大输出。 ============================================================== 【程序6】 题目:用*号输出字母C的图案。 ============================================================== 【程序7】 题目:输出特殊图案,请在c环境中运行,看一看,Very Beautiful! ============================================================== 【程序8】 题目:输出9*9口诀。 ============================================================== 【程序9】 题目:要求输出国际象棋棋盘。 ============================================================== 【程序10】 题目:打印楼梯,同时在楼梯上方打印两个笑脸。 -------------------------------------------------------------------------------- 【程序11】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月 后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? ==============================================================

统计学经典题库与答案

2. 数据筛选的主要目的是( A 、发现数据的错误 C 、找出所需要的某类数据 3. 为了调查某校学生的购书费用支出, B 、对数据进行排序 D 纠正数据中的错误 将全校学生的名单按拼音顺序排列后,每 ) A H 0:二=0.15;二-0.15 B H o :二二 0.15;二=0.15 C H 0: 一 - 0.15;二:: 0.15 D H 0:二乞 0.15;二 0.15 9. 若甲单位的平均数比乙单位的平均数小, 大,则( )。 A 、甲单位的平均数代表性比较大 C 甲单位的平均数代表性比较小 10. 某组的向上累计次数表明( A 、 大于该组上限的次数是多少 B 、 小于该组下限的次数是多少 但甲单位的标准差比乙单位的标准差 B 、两单位的平均数一样大 D 、无法判断 1.当正态总体方差未知时,在大样本条件下,估计总体均值使用的分布是 ( A )。 z 分布 B 、t 分布 F 分布 D 、 2 分布 A 、比平均数高出2个标准差 C 等于2倍的平均数 D 5.峰态通常是与标准正态分布相比较而言的。 则峰态系数的值( )。 B 比平均数低2个标准差 等于2倍的标准差 如果一组数据服从标准正态分布, A =3 C 、v 3 6. 若相关系数r=0,则表明两个变量之间( A 、相关程度很低 C 不存在任何关系 7. 如果所有变量值的频数都减少为原来的 1/3, 均数( )。 A 、不变 B C 减少为原来的1/3 D > 3, =0 )。 不存在线性相关关系 存在非线性相关关系 而变量值仍然不变,那么算术平 扩大到原来的3倍 不能预测其变化 8. 某贫困地区所估计营养不良的人高达 15%然而有人认为这个比例实际上还要 高,要检验该说法是否正确,则假设形式为( )。 隔50名学生抽取一名进行调查,这种调查方式是( A 、简单随机抽样 B 、分层抽样 C 、系统抽样 D 、整群抽样 4. 如果一组数据标准分数是(-2 ),表明该数据( )。

算法分析与设计期末模拟试题

安徽大学2010-2011学年第1学期《算法分析与设计》 期末试题 押宝 (内部交流,非考试试题,学生自发交流创作,版权归作者testfudan@https://www.360docs.net/doc/dc12993964.html, 所有) 一、选择题(单选)(10*2’=20’) 1. 选择正确的组合对于 2112n +=( ) ①2()o n ② 2()O n ③2()n θ ④2()n Ω ⑤ 2()n ω A. ①③④ B. ②③④ C.③④⑤ D. ①⑤ 2. ①21()()n i i O n O n ==∑ ②2()()n O n O n = ③(log )()O n O n ? ④ 2.99993 ()n O n = ⑤2/lo g ()n n n ω=其中正确的有( ) A .5组 B.4组 C.3组 D.没有正确的 3. 2/102n n +=( ) A. 2()O n B.(2)n O C.2(2)n n O + D.2 ()o n 4. 211/n += ( )(我认为是比较不错的一道题,考试可能会出现相同的方法,用极限定义来做,最后一节课老师也讲过类似的方法) A. ()O n B.()o n C.()n Ω D.(1)O 5. 310lo g n = ( ) A.(log )O n n B. (log )O n C. 3()O n D. lo g ()n O n 6. 认真完成课后习题P5面的算法分析题1-6,里面也有我不会做的,可是有谁愿意讨论? 如果能够把以上的题目都能做对,应该就是掌握了。给自己一个奖励吧!答案(如有问题,联系我吧):1-5:BBBDB 6.做出来对对答案吧。 二、填空题 1.()2(/2)T n T n n =+????的一个渐进上界为 (答案:(log )O n n ,用迭代法) 2.()(/3)(2/3)()T n T n T n O n =++的一个渐进上界为 (答案:(log )O n n ,用递归树求解,不会的赶快看) 3.()9(/3)T n T n n =+的一个渐进紧致界为 (答案:2 ()n θ,采用迭代法或者采用主方法,不会的赶快看)

ACM经典算法及配套练习题

POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,p oj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,poj1062,poj2253,poj1125,poj2240) (3)最小生成树算法(prim,kruskal) (poj1789,poj2485,poj1258,poj3026) (4)拓扑排序(poj1094) (5)二分图的最大匹配(匈牙利算法) (poj3041,poj3020) (6)最大流的增广路算法(KM算法). (poj1459,poj3436) 三.数据结构. (1)串(poj1035,poj3080,poj1936) (2)排序(快排、归并排(与逆序数有关)、堆排) (poj2388,poj2299) (3)简单并查集的应用. (4)哈希表和二分查找等高效查找法(数的Hash,串的Hash) (poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503) (5)哈夫曼树(poj3253) (6)堆 (7)trie树(静态建树、动态建树) (poj2513) 四.简单搜索 (1)深度优先搜索(poj2488,poj3083,poj3009,poj1321,poj2251) (2)广度优先搜索(poj3278,poj1426,poj3126,poj3087.poj3414) (3)简单搜索技巧和剪枝(poj2531,poj1416,poj2676,1129) 五.动态规划 (1)背包问题. (poj1837,poj1276) (2)型如下表的简单DP(可参考lrj的书page149): 1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533) 2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最长公共子序列) (poj3176,poj1080,poj1159) 3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题) 六.数学 (1)组合数学:

高二81统计随机抽样直方图茎叶图知识点经典例题及练习题带答案

环球雅思教育学科教师讲义 讲义编号: ______________ 副校长/组长签字:签字日期: 【考纲说明】 1、理解随机抽样的必要性和重要性,了解分布、样本数据标准差的意义和作用,理解用样本估计总体的思想。 2、会画频率分布直方图、频率折线图、茎叶图,会用随机抽样的基本方法和样本估计总体的思想解决一些简单的实际问题 【趣味链接】 U2合唱团在17分钟内得赶到演唱会场,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有两人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则以较慢者的速度为准。BONO需花1分钟过桥,EDGE需花2分钟过桥,ADAM需花5分钟过桥,LARRY需花10分钟过桥,他们要如何在17分钟内过桥呢? 【知识梳理】 一、抽样方法与总体分布的估计 1、随机抽样 (1)总体:在统计学中, 把研究对象的全体叫做总体,把每个研究对象叫做个体,把总体中个体的总数叫做总体容量.总体与个体之间的关系类似于集合与元素的关系. (2)样本:从总体中随机抽取一部分个体叫做总体的一个样本,样本中个体的数目称为样本的容量,样本和总体之间

的关系类似于子集和集合之间的关系. (3)简单随机抽样:一般地,从元素个数为N 的总体中不放回地抽取容量为的样本,如果每一次抽取时总体中的各个个体被抽到的可能性是相同的,那么这种抽样方法叫简单随机抽样,这样抽取的样本,叫做简单随机样本. 常用的方法有抽签法和随机数表法. (4)系统抽样:当总体中的个体比较多时,将总体分成均衡的若干部分,然后按照预先制定的规则,从每一部分中抽取一个个体,得到所需要的样本,这样的抽样方法称为系统抽样,也称作等距抽样. (5)分层抽样:当总体由有明显差别的几部分组成时,为了使抽取的样本更好地反映总体的情况,可将总体中各个个体按某种特征分成若干个互不重叠的几部分,每一部分叫做层,在各层中按层在总体中所占比例进行简单随机抽样或系统抽样,这种抽样方法叫做分层抽样. 2、频率分布直方图与茎叶图 (1)频率分布:样本中所有数据(或数据组)的频数和样本容量的比就是该数据的频率,所有数据(或数据组)的频率的分布变化规律叫做频率分布,可以用频率分布表、频率分布折线图、茎叶图、频率分布直方图来表示. (2)频率折线图:如果将频率分布直方图中各相邻的矩形的上底边的中点顺次连接起,就得到一条折线,称这条折线为本组数据的频率折线图。 (3)总体密度曲线:随着样本容量的增加,作图时所分的组数增加,组距减小,相应的频率折线图会越来越接近于一条光华曲线,即总体密度曲线。 (4)制作茎叶图的方法是:将所有两位数的十位数字作为“茎”,个位数字作为“叶”,茎相同者共用一个茎,茎按从小到大的顺序从上向下列出,共茎的叶一般按从大到小(或从小到大)的顺序同行列出. 茎叶图对于分布在0~99的容量较小的数据比较合适,此时,茎叶图比直方图更详尽地表示原始数据的信息. 在茎叶图中,茎也可以放两位,后面位数多可以四舍五入后再制图. 3、样本的数字特征 (1)众数:出现次数最多的数叫做众数. (2)中位数:如果将一组数据按大小顺序依次排列,把处在最中间位置的一个数据或中间两个数据的平均是叫做这组数据的中位数. (3)平均数与加权平均数:如果有n 个数,,,,n x x x x ??321那么12n x x x x n ++???+= 叫做这n 个数的平均数. 如果在n 个数中,1x 出现次1f 次, 2x 出现次2f 次,……,k x 出现次2f 次,(这里),n f f f k =+??++21那么 11221 ()k k x x f x f x f n =++???+叫做这n 个数的加权平均数,其中k f f f ??,,21叫做权. (4)标准差与方差:设一组数据123n x x x x ?,,,,的平均数为x ,则

贪心算法的应用

从贪心算法的定义可以看出,贪心法并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。 我们看看下面的例子 例1 均分纸牌(NOIP2002tg) [问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。例如 N=4,4 堆纸牌数分别为: ①9 ②8 ③17 ④6 移动3次可达到目的: 从③取 4 张牌放到④(9 8 13 10) -> 从③取 3 张牌放到②(9 11 10 10)-> 从②取 1 张牌放到①(10 10 10 10)。 [输入]:键盘输入文件名。 文件格式:N(N 堆纸牌,1 <= N <= 100) A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000) [输出]:输出至屏幕。格式为:所有堆均达到相等时的最少移动次数。 [输入输出样例] : 4 9 8 17 6 屏慕显示:3 算法分析:设a[i]为第i堆纸牌的张数(0<=i<=n),v为均分后每堆纸牌的张数,s为最小移到次数。 我们用贪心法,按照从左到右的顺序移动纸牌。如第i堆(0v,则将a[i]-v张纸牌从第I堆移动到第I+1堆; (2)若a[i]

统计案例分析典型例题

统计案例分析及典型例题 §抽样方法 1.为了了解所加工的一批零件的长度,抽取其中200个零件并测量了其长度,在这个问题中,总体的一个样本是 . 答案 200个零件的长度 2.某城区有农民、工人、知识分子家庭共计2 004户,其中农民家庭1 600户,工人家庭303户,现要从中抽取容量为40的样本,则在整个抽样过程中,可以用到下列抽样方法:①简单随机抽样,②系统抽样,③分层抽样中的 . 答案①②③ 3.某企业共有职工150人,其中高级职称15人,中级职称45人,初级职称90人.现采用分层抽样抽取容量为30的样本,则抽取的各职称的人数分别为 . 答案3,9,18 4.某工厂生产A、B、C三种不同型号的产品,其相应产品数量之比为2∶3∶5,现用分层抽样方法抽出一个容量为n的样本,样本中A型号产品有16件,那么此样本的容量n= . 答案80 例1某大学为了支援我国西部教育事业,决定从2007应届毕业生报名的18名志愿者中,选取6人组成志愿小组.请 用抽签法和随机数表法设计抽样方案. 解抽签法: 第一步:将18名志愿者编号,编号为1,2,3, (18) 第二步:将18个号码分别写在18张外形完全相同的纸条上,并揉成团,制成号签; 第三步:将18个号签放入一个不透明的盒子里,充分搅匀; 第四步:从盒子中逐个抽取6个号签,并记录上面的编号; 基础自测

第五步:所得号码对应的志愿者,就是志愿小组的成员. 随机数表法: 第一步:将18名志愿者编号,编号为01,02,03, (18) 第二步:在随机数表中任选一数作为开始,按任意方向读数,比如第8行第29列的数7开始,向右读; 第三步:从数7开始,向右读,每次取两位,凡不在01—18中的数,或已读过的数,都跳过去不作记录,依次可得到12,07,15,13,02,09. 第四步:找出以上号码对应的志愿者,就是志愿小组的成员. 例2 某工厂有1 003名工人,从中抽取10人参加体检,试用系统抽样进行具体实施. 解 (1)将每个人随机编一个号由0001至1003. (2)利用随机数法找到3个号将这3名工人剔除. (3)将剩余的1 000名工人重新随机编号由0001至1000. (4)分段,取间隔k= 10 0001=100将总体均分为10段,每段含100个工人. (5)从第一段即为0001号到0100号中随机抽取一个号l. (6)按编号将l ,100+l ,200+l,…,900+l 共10个号码选出,这10个号码所对应的工人组成样本. 例3 (14分)某一个地区共有5个乡镇,人口3万人,其中人口比例为3∶2∶5∶2∶3,从3万人中抽取一个300人 的样本,分析某种疾病的发病率,已知这种疾病与不同的地理位置及水土有关,问应采取什么样的方法并写出具体过程. 解 应采取分层抽样的方法. 3分 过程如下: (1)将3万人分为五层,其中一个乡镇为一层. 5分 (2)按照样本容量的比例随机抽取各乡镇应抽取的样本. 300×153=60(人);300× 15 2 =40(人); 300×155=100(人);300×15 2=40(人); 300× 15 3=60(人), 10分 因此各乡镇抽取人数分别为60人,40人,100人,40人,60人. 12分 (3)将300人组到一起即得到一个样本. 14分

贪心算法经典问题:活动安排,背包问题,最优装载,单源最短路径 Dijiksra,找零钱问题,多机调度

活动安排 public static int greedySelector(int [] s, int [] f, boolean a[]) { //s[]开始时间f[]结束时间 int n=s.length-1; a[1]=true; int j=1; int count=1; for (int i=2;i<=n;i++) { if (s[i]>=f[j]) { a[i]=true; j=i; count++; } else a[i]=false; } return count; } 背包问题 void Knapsack(int n,float M,float v[],float w[],float x[]) { Sort(n,v,w); //以每种物品单位重量的价值Vi/Wi从大到小排序 int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break; x[i]=1; c-=w[i]; } if (i<=n) x[i]=c/w[i]; //允许放入一个物品的一部分 } 最优装载 void Loading(int x[], T ype w[], T ype c, int n) { int *t = new int [n+1]; //t[i]要存的是w[j]中重量从小到大的数组下标Sort(w, t, n); //按货箱重量排序 for (int i = 1; i <= n; i++) x[i] = 0; //O(n) for (int i = 1; i <= n && w[t[i]] <= c; i++) {x[t[i]] = 1; c -= w[t[i]];} //调整剩余空间 } 单源最短路径Dijiksra template void Dijikstra(int n, int v, Type dist[], int prev[], Type **c) { //c[i][j]表示边(i,j)的权,dist[i]表示当前从源到顶点i的最短特殊路径bool s[maxint]; for(int i= 1;i<=n; i++) { dist[i]=c[v][i]; s[i]=false;

统计与概率精典例题解析(含答案)

统计与概率精典例题解析 在新课标理念指导下,预计2011年考查有关统计与概率的知识点将着重数据的分析和事件发生机会大小的确定以及统计与概率知识的实际应用,对统计中涉及的计算将趋向简单.试题将会继续结合社会热点,创设一些新的情境来涉及有关统计与概率的知识,突出收集、整理、描述信息,建立数学模型(概率模型),进而解决问题.中考中会适当设置一些把统计、概率知识和方程、不等式、函数等知识结合在一起的开放型问题和探索问题,或者出现与其他学科、生活知识等综合的题型,注重考查学生的创新意识与实践能力.本文就精典例题的解析,并以此作为预测,仅供复习参考. 【例1】下列调查方式,合适的是() A.要了解一批灯泡的使用寿命,采用普查方式 B.要了解中央电视台“星光大道”栏目的收视率,采用普查方式 C.要保证“神舟六号”载人飞船成功发射,对重要零部件的检查采用抽查方式 D.要了解外地游客对吉林雾凇冰雪节的满意度,采用抽查方式 【分析】要了解一批灯泡的使用寿命必须采用抽查,所以选项A错误;了解电视节目的收视率采用普查虽然能够得出详细结论,但普查范围太大不容易实现,所以采用抽查方式合适,所以选项B错误;“神舟六号”载人飞船是高科技产品,要保证它发射成功任何一个重要零部件都要求完好,所以必须普查,所以选项C错误. 解:D. 【点评】普查是为了一定目的对考察对象进行的全面调查;抽样调查是从总体中抽取部分个体进行的调查.明确调查的问题,弄清普查和抽样调查所适合的对象和各自的含义是解题的关键. 【例2】班主任为了解学生星期六、日在家的学习情况,家访了班内的六位学生,了解到他们在家学习时间如下表所示,那么这六位学生学习时间的众数与中位数分别是

算法分析与设计选修课-贪心算法应用研究

武汉理工大学 算法设计与分析论文题目:贪心算法应用研究 姓名:吴兵 学院:信息工程 专业班级:电子133 学号: 1409721303131 任课教师:张小梅

目录 摘要 (1) 1.绪论 (2) 2贪心算法的基本知识概述 (3) 2.1 贪心算法定义 (3) 2.2 贪心算法的基本思路及实现过程 (3) 2.3贪心算法的核心 (3) 2.4贪心算法的基本要素 (4) 2.5 贪心算法的理论基础 (6) 2.6 贪心算法存在的问题 (7) 3贪心算法经典应用举例 (8) 3.1删数问题 (8) 3.2 汽车加油问题 (10) 3.3会场安排问题 (12) 4.总结 (16) 5.参考文献 (17)

摘要 在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。从贪心算法的定义可以看出,贪心法并不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。贪心算法所作的选择可以依赖于以往所作过的选择,但决不依赖于将来的选择,也不依赖于子问题的解,因此贪心算法与其它算法相比具有一定的速度优势。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。本文讲述了贪心算法的含义、基本思路及实现过程,贪心算法的核心、基本性质、特点及其存在的问题。并通过贪心算法的特点举例列出了以往研究过的几个经典问题,对于实际应用中的问题,也希望通过贪心算法的特点来解决。 关键词:贪心算法最小生成树多处最优服务次序问题删数问题

数据结构(C语言)【经典题库】含标准答案

《数据结构与算法》复习题 选择题 1.在数据结构中,从逻辑上可以把数据结构分为 C 。 A.动态结构和静态结构 B.紧凑结构和非紧凑结构 C.线性结构和非线性结构 D.内部结构和外部结构 2.数据结构在计算机内存中的表示是指 A 。 A.数据的存储结构 B.数据结构 C.数据的逻辑结构 D.数据元素之间的关系 3.在数据结构中,与所使用的计算机无关的是数据的 A 结构。 A.逻辑 B.存储 C.逻辑和存储 D.物理 4.在存储数据时,通常不仅要存储各数据元素的值,而且还要存储 C 。A.数据的处理方法 B.数据元素的类型 C.数据元素之间的关系 D.数据的存储方法 5.在决定选取何种存储结构时,一般不考虑 A 。 A.各结点的值如何 B.结点个数的多少 C.对数据有哪些运算 D.所用的编程语言实现这种结构是否方便。 6.以下说法正确的是 D 。 A.数据项是数据的基本单位 B.数据元素是数据的最小单位

C.数据结构是带结构的数据项的集合 D.一些表面上很不相同的数据可以有相同的逻辑结构 7.算法分析的目的是 C ,算法分析的两个主要方面是 A 。(1)A.找出数据结构的合理性 B.研究算法中的输入和输出的关系C.分析算法的效率以求改进 C.分析算法的易读性和文档性(2)A.空间复杂度和时间复杂度 B.正确性和简明性 C.可读性和文档性 D.数据复杂性和程序复杂性 8.下面程序段的时间复杂度是 O(n2) 。 s =0; for( I =0; i

统计学经典题库与答案课件

1.当正态总体方差未知时,在大样本条件下,估计总体均值使用的分布是( )。 A 、z 分布 B 、t 分布 C 、F 分布 D 、2χ分布 2.数据筛选的主要目的是( )。 A 、发现数据的错误 B 、对数据进行排序 C 、找出所需要的某类数据 D 、纠正数据中的错误 3.为了调查某校学生的购书费用支出,将全校学生的名单按拼音顺序排列后,每隔50名学生抽取一名进行调查,这种调查方式是( ) A 、简单随机抽样 B 、分层抽样 C 、系统抽样 D 、整群抽样 4.如果一组数据标准分数是(-2),表明该数据( )。 A 、比平均数高出2个标准差 B 、比平均数低2个标准差 C 、等于2倍的平均数 D 、等于2倍的标准差 5.峰态通常是与标准正态分布相比较而言的。如果一组数据服从标准正态分布,则峰态系数的值( )。 A 、=3 B 、>3, C 、<3 D 、=0 6.若相关系数r=0,则表明两个变量之间( )。 A 、相关程度很低 B 、不存在线性相关关系 C 、不存在任何关系 D 、存在非线性相关关系 7.如果所有变量值的频数都减少为原来的1/3,而变量值仍然不变,那么算术平均数( )。 A 、不变 B 、扩大到原来的3倍 C 、减少为原来的1/3 D 、不能预测其变化 8.某贫困地区所估计营养不良的人高达15%,然而有人认为这个比例实际上还要高,要检验该说法是否正确,则假设形式为( )。 A 、15.015.00=≠ππ;:H B 、15.015.00≠=ππ;:H C 、15.015.00<≥ππ;:H D 、15.015.00>≤ππ;:H 9.若甲单位的平均数比乙单位的平均数小,但甲单位的标准差比乙单位的标准差大,则( )。 A 、甲单位的平均数代表性比较大 B 、两单位的平均数一样大 C 、甲单位的平均数代表性比较小 D 、无法判断 10.某组的向上累计次数表明( ) A 、大于该组上限的次数是多少 B 、小于该组下限的次数是多少

相关文档
最新文档