题目:
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理, 市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?
一开始我把题目想复杂了,以为是转移n名罪犯,每次转移c名,有多少种方法?后来又细细看题,发现这题目其实问的很简单,只是问在n的数字中,取c个连续的数字,其和不大于t,有多少种取法;这里用滑动窗口的思想是最简单的,直接上代码
public static int getMethodNum(int n,int t,int c,int[] a){
int count=0;
int temp=0;
for(int i=0;i<c;i++){
temp+=a[i];//算第一组c个人的罪值
}
if(temp<=t){
count++;//当第一次罪值满足条件的时候,方法总数加一
}
for(int i=c;i<a.length;i++){
temp=temp+a[i]-a[i-c];//这里是关键,每次移动的时候这里都加a[i],减去a[i-c],相当于每次保持c容量的固定窗格往前移
if(temp<=t){
count++;//每往前移动一步,就说明者c个数是满足条件的,加1
}
}
return count;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();//n个犯人
int t=in.nextInt();//罪值t
int c=in.nextInt();//转移的人数
int[] a=new int[n];
for(int i=0;i<n;i++){
a[i]=in.nextInt();
}
System.out.println(getMethodNum(n, t, c, a));
}
}