题解 #wwhhu#

题目:

芳草三月,落樱缤纷,一年一度的 whu 樱花又开放啦!为了建设国家 5A 级景区,whu 保卫部计划利用横幅写下对每一位游客的热切欢迎!

游客老叶收到了一个可以写 nnn 个小写字母的横幅,由于保卫部的疏忽,Ta 需要在上面写下对自己的欢迎语。

不过有原则的保卫部也提出了要求:如果将这个 nnn 个小写字母视为一串连续的序列,那么子序列 "whu" 的出现次数最好尽可能大!

序列 aaa 的子序列指从 aaa 中将若干元素(特别的,0 个或全部)提取出来且并 不改变剩余元素相对位置 形成的序列,例如 '', 'a', 'ab', 'acb' 均为 ''acb'' 的子序列,而 'ca', 'bc' 不是。注意,位置不同但字母相同的子序列在本题中视为不同的子序列,例如, ''aa'' 的子序列共有 '', 'a', 'a', 'aa' 四个。

输入描述:

一行一个整数 n\ (1\le n \le 500)n (1≤n≤500)

输出描述:

一行一个整数,表示子序列 "whu" 的最大出现次数

 

 解析:

      这道题目是给了我们n个小写字母序列,然后要我们求出“whu”出现的最大次数,结果只是要一个数字,那就只需要用数学方法求出即可。那么这样才能将这个数最大化呢,尽可能使得任意一个“w”和“任意一个“h”以及任意一个“u”都能组成一个“whu”,意思就是说“w”尽可能放在前面,“u”尽可能放在后面,此时数量会多一点。这个时候也正好是满足乘法原理。

      现在我们已经知道怎么样排列会有最大值,现在只需要求出来最大值就可以了。假设“w”有x个,“h”有y个,a代表输入的n个小写字母,则“u”有a-x-y个。最大值就有f=xy(a-x-y)个。下面就是对f求极值。

题解 #wwhhu#_第1张图片

 当f取得极大值时,x和y的值肯定不能为0,所以(a-2x-y)和(a-2y-x)的值为零,求得x=y=a/3。所以要想取得最大值就需要“w”“h”“u”的数量尽可能接近,这里我是(a/3)取整作为“w”的数量,剩下的小写字母有(a-x)个,然后除以二取整为“h”的数量,最后剩下的为“u”的数量。

看一下代码:

#include 
#include 
int main()
{
    int a;
    scanf("%d",&a);
    if (a>=3) printf("%d",(a/3)*((a-(a/3))/2)*(a-(a/3)-((a-(a/3))/2)));
    else printf("0");
}

 最后是运行结果:题解 #wwhhu#_第2张图片希望这道题目能给大家有所启发 (。・ω・。)ノ

 

 

 

 

 

你可能感兴趣的:(练习题(记录做题想法),c语言)