题目看似简单,实则不易。以下是本人对题目的难度平分:
A:横冲直撞的车 2/20;
B:精英人才 5/20;
C:统计和 15/20;
D:字符串拼接 15/20.
A:
{
较简单,一个点超时,个人归为判题机的锅……
其实算法在优化一下就不会出现这种只有百分之几的意外了
}
B:
{
//需要注意审题
当价值为负数时,把价值赋值为0,
处理方法:
for(int i=1;i<=n;i++) //map[i].v存储价值,map[i].ch存储竞赛的类别
{
string ch;
cin>>ch;
cin>>map[i].v;
if(map[i].v<0) map[i].v=0;
map[i].l=ch.size();
map[i].ch=ch;
}
输入后进行sort,
实现方法(cmp函数):
int cmp(m a,m b)
{
if(a.ch!=b.ch) return a.ch<b.ch;
else if(a.l!=b.l) return a.l<b.l;
else return a.v>b.v;
}
最后ans+=每种竞赛前三的价值即可
}
C:
{
一个数学题,找规律
先列出数据:
(1) n=10,m=9;
1 2 3 4 5 6 7 8 9 10
可以发现1、2、3、4、5都无法加小于它的数,使和大于m
可以发现9、10可以加前面任意数使和大于m;
可以发现6、7、8加前面的数使得大于m的方案数分别为2、4、6.
(2) n=10,m=8;
1 2 3 4 5 6 7 8 9 10
可以发现1、2、3、4都无法加小于它的数,使和大于m
可以发现8、9、10可以加前面任意数使和大于m;
可以发现5、6、7、8加前面的数使得大于m的方案数分别为1、3、5、7.
数分为三段 :A B C
A段边界为(l=1,r=(m+1)/2);
当n>=m时,B段边界为(l=(m+1)/2+1,r=m-1),
当m>n时,B段边界为(l=(m+1)/2+1,r=n);
C段值的和则可以用公式 ((m-1)+(n-1))*(n-m+1)/2 (等差数列公式)表示.
注:当m>n时无C段。
}
D:
{
数据水,本人水过的,在此不详细解说。
(这是道动态规划题目)
}
A题代码