【问题描述】
由于沙之国长年干旱,法师小明准备施展自己的一个神秘法术来求雨。
这个法术需要用到他手中的 49 张法术符,上面分别写着 1 至 49 这 49 个数字。法术一共持续 7 周,每天小明都要使用一张法术符,法术符不能重复使用。
每周,小明施展法术产生的能量为这周 7 张法术符上数字的中位数。法术施展完 7 周后,求雨将获得成功,降雨量为 7 周能量的中位数。
由于干旱太久,小明希望这次求雨的降雨量尽可能大,请问最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【输入】
没有输入。
【输出】
输出一个整数
【提示】
把答案放在输出语句中输出,例如C/C++语言可以用printf或cout。
思路
emmm在这之前我想要吐槽一下我自己,真的愚蠢…居然想到了用全排列来做…还写出了代码…一边写一边自言自语说这样肯定运行不起,结果就是运行不起。后来也没想到好思路。不过拿纸和笔画了一下,就解决了,看来还是找规律更容易些。如下图:
也就是中位数后面的几个数肯定要比中位数大,进而可以看出来最少有15个数比我们要求的数大,因此49-15=34就是我们要求的最大降雨量。
答案:34
更新!!
看到了别个的思路,感觉比我的清晰,占为己有!hhhh
如下:
每周7天,中位数位为第四天,所以我们要使后四天尽量大所以
第一次我们取后四天为(46~49),第四天为:46
第二次我们取后四天为(42~45),第四天为:42
第三次我们取后四天为(38~41),第四天为:41
第四次我们取后四天为(34~37),第四天为:37
第五次我们取后四天为(30~33),第四天为:33
第六次我们取后四天为(26~29),第四天为:29
第七次我们取后四天为(22~25),第四天为:25
所以最大降雨量为:(46+42+38+34+30+26+22)/7=34
(来自简书)
下面附上我运行不出来的代码:
用全排列写的,我觉得理论上是可行的,运行不出来可能是运运行崩了,毕竟49个数的全排列有8789267254022766592种…可能。当然,这只是我自己的想法,注释里面有思路,**如果有错误,欢迎小伙伴们指正!!!**ovo
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
int maxyu = 0; //最大降雨量,用来更新
void process(int *a)
{
int i,j,x;
int c[7];//7周的能量
int yu;//下雨量
int b[7][7]; //7周7天 ,数组元素值代表当天的法术符
int n=0; //标记数组位置
for(i=0;i<7;i++) //将全排列生成的a数组放进b这个2维数组,b代表7周
{
for(j=0;j<7;j++)
{
b[i][j]=a[n++];
}
}
for(i=0;i<7;i++)//对每周的排序,以方便选出中位数
{
sort(b[i],b[i]+7);
}
for(i=0;i<7;i++) //将每周的能量(中位数)放进c数组
{
c[i]=b[x][3];
}
sort(c,c+7); //对七周能量排序
yu = c[3]; //找出七周能量的中位数
if(yu>maxyu) //找出最大的降雨量
maxyu=yu;
}
int main ()
{
int a[49];
int n=49;
int i;
for(i=0;i<49;i++) //获取数组a,数组元素为 1-49
a[i]=i+1;
do //生成全排列
{
process(a);
}while(next_permutation(a,a+n));
printf("%d",maxyu);
return 0;
}