小汪作为一个有数学天分的程序猿,设计了一套密码生成器来搞定自己的密码问题。
密码生成器由N个槽位组成,槽位的下标为0~N-1,每个槽位存储一个数。起初每个槽位都是0。
密码生成器会进行M轮计算,每轮计算,小汪会输入两个数L,R(L<=R),密码生成器会将这两个数作为下标,将两个下标之间(包含)的所有槽位赋值为i(i为当前的轮次,i∈[1,M])。
M轮计算完成后,密码生成器会根据槽位的最终值生成一条密码,密码的生成规则为:
(0*a[0] + 1*a[1] + 2*a[2] + ... + (N-1)*a[N-1]) mod 100000009
其中a[i]表示第i个槽位的最终值。
请帮助小汪把他的密码生成器实现为代码。

链接:https://www.nowcoder.com/questionTerminal/96bf0c548a094de7a05919e0b32b1a5a?toCommentId=6455114
来源:牛客网

分析

  (1)第一种方式,根据题意使用数组表示槽位。但是最坏的时间复杂度达到O(m*n),我的代码只能通过30%的测试。  (2)第二种方式,使用问题转换。只记录分割片段,输入数据的同时实时更新已经记录的片段。最后通过数学公式获得最终值。我的代码在本地能通过题目提供的测试,但是在web端提交运行出现错误且未通过(您的代码已保存

请检查是否存在数组越界等非法访问情况)。在这种方法中,槽位n并没有被实际用到。

代码

方式1代码:

 1 import java.util.Arrays;
 2 import java.util.Scanner;
 3 
 4 /**
 5  *题目:小汪的密码问题
 6  * 使用数组记录每个槽位
 7  */
 8 public class Main6_1{
 9     public static void main(String args[]){
10         Scanner in = new Scanner(System.in);
11         int n,m;
12         n = in.nextInt();   //槽位
13         m = in.nextInt();   //运算轮次
14         int[] dp = new int[n];  //创建槽位
15         int x,y;
16         //循环计算
17         for(int i=1;i<=m;i++){
18             x = in.nextInt();
19             y = in.nextInt();
20             /*while(x<=y){
21                 dp[x++]=i;
22                 dp[y--]=i;
23             }*/
24             //内部实际也是遍历填充
25             Arrays.fill(dp,x,y+1,i);
26             //System.out.println(Arrays.toString(dp)); //显示每一轮计算后的结果
27         }
28         //根据规则计算结果值
29         double res = 0;
30         for(int i=0;i<n;i++){
31             res+=i*dp[i];
32         }
33         //对结果值取模
34         System.out.printf("%.0f",res%100000009);
35     }
36 }
View Code

相关文章: