2010 有道难题3

来源:互联网 发布:同花顺ifind mac版 编辑:程序博客网 时间:2024/05/18 14:13
描述

小明打算本科毕业后申请出国,不过他想申请一个好学校,所有课程的加权平均分必须达到90分及以上。

现在小明已经修完所有的必修课,他想通过修一些选修课让课程加权平均分最终达到他的要求。一共有m门选修课可以随意选修,且他能很明确知道选修每个选修课能得到的分数,请问至少修多少门课才能达到他的要求?假设共有k门课程,其总的加权平均分的计算方法如下:

加权平均分=(成绩1*学分1+成绩2*学分2+……成绩k*学分k) / (学分1+学分2+……学分k)

输入

第一行包含一个正整数T,表示有T组测试数据。
每个测试数据第一行包含空格隔开的两个正整数n和m,表示小明已修完了n门必修课,还有m门选修课可供选择。
接下来有n行,每行包含空格隔开的一个实数ai和一个整数bi,分别表示小明第i门课的成绩以及第i门课的学分数
接下来有m行,每行包含空格隔开的一个实数cj和一个整数dj,分别表示小明第j门选修课可以获得的预期分数以及第j门选修课的学分数。
其中:
1<=T<=100, 1 <= n,m <= 100, 0 <= ai, cj <= 100, 1 <= bi, dj <= 5,所有的分数小数点后至多两位。

输出

每组测试数据输出一行,如果可以达到要求,则输出一个整数k,表示小明至少要修的选修课数目,如果小明修完所有的选修课都不可能达到要求,则输出 Impossible

样例输入
2
3 4
80.00 1
40.00 2
20.00 2
90.00 3
88.00 2
92.00 2
100.00 1
3 4
62.00 1
70.00 1
80.00 1
99.00 2
100.00 2
100.00 2
100.00 2
样例输出
Impossible
3
这题其实完全可以直接爆搜范围才100,当时完全没有看它的范围了,每次选一个最优的,直到不能满足或者已经满足就停止;
什么是最优的呢,就是按公式算了之后必当前带权平均值大的;
代码
B题
描述
在X星球上的外星人和地球上一样拥有一个长N位的身份证号码,而X星球的人使用的是一种26进制身份证号码,用a~z表示。
在X星球上正在举行一次幸运者抽奖活动,X星球的政府首脑制定了一个特殊的抽奖规则,凡是身份证号码符合对称性质(回文串)的人就能够成为本次活动的幸运者。
现在你知道X星球中最大的身份证号码,希望你能够计算出最多有多少人将成为本次活动的幸运者。
输入
输入数据的第一行为一个正整数N,第二行为一个长度为N的字符串,表示已知的最大身份证号码.
其中 N <= 30
输出
本次活动的最大幸运人数模10000的结果.
样例输入
3
bca
样例输出
28


提示
样例说明:幸运者的身份证号为 a[a~z]a,bab,bbb
这题最郁闷,其实是我把问题想的太复杂的,没有去具体的剖析了。。。
按位计算小于该位的回文;
例如.befcg,对于第一位而言,<b的只有a,1*26*26,第2位小于e的有abcd,4*26,第3位有abcde 5 ;
那么结果就是1*26*26+4*26+5;
但是这里有一个bug,如果前面的n/2位全部固定以后,能不能构成回文,这里有befeb显然<befcg,所以必须+1;
代码:
C题:
描述

如上图所示,我们可以用不同数量的火柴排成0~9这10个数字。现在这个问题需要让聪明的你来计算一下,给你N根火柴,总共可以组合成多少个被M取余后结果是素数的数字。
注意,N根火柴都要用上,另外,除了0,其他数字均不能出现前导零。
输入
第一行有一个正整数T,表示有T组测试数据。
接下来T行每一行表示一组测试数据,每行包含空格隔开的两个正整数N和M。
其中:
T < =20,
N, M <=10000并且M*N<=1000000
输出
对于每一个测试数据,请输出一行,包含一个数,即结果对1000000007取模的值。
样例输入
4
4 15
20 4
6 10
6 20
样例输出
1
6982
1
2
dp:
dp[i][j]表示i根火柴组成的数%m之后还有j的个数;
那么状态转移:
for(int k=0;k<10;k++)
    dp[(i+f[k])*m+(j*10+k)%m] += dp[i*m+j];
但是这里nm都很大,显然二维dp[i][j]显然不行,但是题意有M*N<=1000000 ,所以可以降维;
代码: