k倍区间
给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入
-----
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出
-----
输出一个整数,代表K倍区间的数目。
例如,
输入:
5 2
1
2
3
4
5
程序应该输出:
6
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。
你能求出数列中总共有多少个K倍区间吗?
输入
-----
第一行包含两个整数N和K。(1 <= N, K <= 100000)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)
输出
-----
输出一个整数,代表K倍区间的数目。
例如,
输入:
5 2
1
2
3
4
5
程序应该输出:
6
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
*/
个人感觉 这次题难度是不是放反了, 这最后一个题 这么简单..
我的思路:这个序列有两种情况 下一个比他大1 或小1,直接用if分两种情况 下一个若不是这种情况 直接break 。从下一个数开始分析,算出该序列的长度 是k的几倍 就有几个k倍区间
import java.util.Scanner;
public class k倍区间 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int n=s.nextInt();
int k=s.nextInt();
if(n<1||n>100000||k<1||k>100000)return;
int arr[]=new int[n];
for(int i=0;i<n;i++){
arr[i]=s.nextInt();
}
System.out.println(fun(arr,k));
}
public static int fun(int a[],int k){
int sum=0;
for(int i=0;i<a.length-1;i++){
int len=1;
if(a[i+1]-a[i]==1){//下一个比他大一
len=2;
for(int j=i+2;j<a.length;j++){
if(a[j]-a[j-1]==1){
len+=1;
}else break;
}
sum+=len/k;//直接算完这个序列多长 是k的几倍 就有几个k被区间
}
if(a[i+1]-a[i]==-1){//下一个比他小一
len=2;
for(int j=i+2;j<a.length;j++){
if(a[j]-a[j-1]==-1){
len+=1;
}else break;
}
sum+=len/k;
}
}
return sum;
}
}