排列搜索-c#求解-英雄会在线编程题目

       反正晚上没什么事,吧排列搜索这道题也一并写了吧。先看题目:

排列搜索
  • 发布公司:
  • 有 效 期:
  • 赛    区:
  • CSDN                
  • 2014-01-282014-02-27
  • 北京
  • 难 度 等 级:
  • 答 题 时 长:
  • 编程语言要求:
  • 120分钟
  • C C++ Java C#                 
题目详情

设数组a包含n个元素恰好是0..n - 1的一个排列,给定b[0],b[1],b[2],b[3]问有多少个0..n-1的排列a,满足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k    

输入包含5个参数:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N。

 

      这道题虽然是两星的,但是感觉比刚才那个瓶子和硬币的要难一些。

猛一看,被题目搞得晕头转向,(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k  

拐了两道弯,所以,不能被题目牵着鼻子走,直接这样看吧:(b[0]*a0+b[1]*a1.....)%n==k  

这样就清晰多了。

 

思路:

第一步求出b[0]......b[3]四个数要乘以哪四个数,得到的结果和符合公式,注意,这里b[0]...b[3]可能有相等,所以,查找之前先要合并下

这四个数在区间[0~n)里面,第一步就很容找到。

 

第二步:

       将找到的四个数在数组a[n]中排序,关键就在这里,排序的过程需要检查,是否符合条件,举例来说:比如n=10,b[0]=3,找到的第一个数a0=2,那么就是将2依次放到a[10]数中的每个位置,对应的a[3]必须只想2所放的索引。比如,2放在a[0]=2,那么就有a[3]=0;同时我们还可以很容的得到:

当a0 != b[0]时,a0在a[]数中中的索引不能是a0和b[0]

其实第二步就是将第一步求出的数排序,看看符合条件的有多少个,最后累加就得到答案了。

 

思路就是这样的,代码写的有点啰嗦,感觉不太理想,提交上去,没问题,通过了。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值