首页 > 试题广场 >

题6

[编程题]题6
  • 热度指数:305 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
你跟小伙伴一起去参加漫展,逛了一天之后你们准备买点手办回家。现在你们来到一排展台前,每个展台有卖不同的手办。但是当天售卖有一个特别的规矩:首先每个展台只有一个手办可买,并且只能买连续相邻某几个展台的手办。现在你跟小伙伴先从头到尾浏览了一遍,知道了总共N家展台,每家展台的手办价格P[0]~P[N-1],小伙伴说愿意资助你S块钱,多的你自付。所以你决定至少要花掉S。但是逛了一天也挺累了,所以你希望能在尽量少的展台花掉小伙伴资助的S,然后回家。

输入第一行是两个整数,分别代表展台的数量N,和小伙伴愿意资助的S;

输入第二行是N个整数,分别代表依次N个展台手办的价格;

你需要考虑的是如果至少要花掉S块(包含S),你最少可以只逛几个展台;当然如果小伙伴是土豪,所有展台手办买一遍还是花不完S,那么返回-1让我们羡慕一下



输入描述:
输入第一行是两个整数,以空格分隔

输入第二行是N个整数,以空格分隔


输出描述:
一个整数,表示至少可以逛几个展台
示例1

输入

5 7
1 2 3 4 5

输出

2
#include <bits/stdc++.h>  
using namespace std;  
int main(){  
    int N, S;  
    while(cin>>N>>S){  
        vector<int> sum(N + 1, 0);  
        for(int i=1; i<=N; ++i) {  
            cin>>sum[i];  
            sum[i] += sum[i-1];  
        }  
        int ans = -1;  
        for(int len=1; len<=N; len++){  
            for(int i=0; i+len < N+1; i++){  
                if(sum[i+len] - sum[i] >= S) {  
                    ans = len;  
                    break;  
                }  
            }  
            if(ans!=-1) break;  
        }  
        cout<<ans<<endl;  
    }  
    return 0;  
}  

发表于 2020-07-17 17:17:33 回复(0)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine()) != null) {
            String[] strs1 = line.split(" ");
            int N = Integer.parseInt(strs1[0]);
            int S = Integer.parseInt(strs1[1]);
            String[] strArr = br.readLine().trim().split(" ");
            int[] P = new int[N];
            for(int i = 0; i < N; i++)
                P[i] = Integer.parseInt(strArr[i]);
            System.out.println(solve(P, S));
        }
    }
    
    private static int solve(int[] prices, int money) {
        int[] sum = new int[prices.length + 1];
        // 计算手办价格的累计分布
        for(int i = 1; i < sum.length; i++){
            sum[i] = prices[i - 1];
            sum[i] += sum[i - 1];
        }
        int res = -1;
        // 遍历购买手办个数的可能性
        for(int len = 1; len <= prices.length; len++){
            // 在固定展台个数的情况下遍历起始展台的可能性
            for(int i = 0; i + len <= prices.length; i++){
                // 只要钱花完了,该展台的数目就符合要求
                if(sum[i + len] - sum[i] >= money){
                    res = len;
                    break;
                }
            }
            // 如果本次遍历完了还没把钱花完,就不用往大再遍历了,钱肯定花不完
            if(res != -1)
                break;
        }
        return res;
    }
}

发表于 2020-10-14 16:19:54 回复(0)
双指针
n, s = map(int, input().split())
p = list(map(int, input().split()))
res, i, j, c = n, 0, 0, 0
while j < n&nbs***bsp;c >= s:
    if c < s:
        c += p[j]
        j += 1
    else:
        res = min(res, j - i)
        c -= p[i]
        i += 1
if i == 0 and c < s: res = -1
print(res)

发表于 2020-09-04 18:14:31 回复(0)
while True:
    try:
        a = list(map(int, input().split(' ')))
        b = list(map(int, input().split(' ')))
        b.sort(reverse=True)
        temp = 0
        count = 0
        for i in b:
            if temp < a[1]:
                temp += i
                count += 1
        if temp < a[1]:
            print('-1')
        else:
            print(count)
    except:
        break

发表于 2020-09-04 12:22:37 回复(0)
n,s = map(int,input().split(' '))
num = list(map(int,input().split(' ')))
left = 0
right = 0 
temp = 0
length = n+1
while right < n:
    if temp < s:
        temp += num[right]
        right += 1
    else:
        length =min(length,right-left)
        temp -= num[left]
        left += 1
while temp >= s:
    length = min(length,n-left)
    temp -= num[left]
    left += 1
if length == n+1:
    print('-1')
else:
    print(length)

编辑于 2020-04-16 11:33:25 回复(0)
滑动窗口入门题
一段子数组的和大于M, 求该最短的子数组长度
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif
 
 
#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#define MAXN 100050
#include <map>
#include <unordered_set>
#define ll long long int
 
using namespace std;
 
int n, m, arr[MAXN], psum[MAXN];
 
int main() {
#ifdef debug
    freopen("test", "r", stdin);
    clock_t stime = clock();
#endif
    scanf("%d %d ", &n, &m);
    int lef = 1, rig = 1, sum = 0, ans = n;
    for(int i=1; i<=n; i++)
        scanf("%d ", arr+i), sum += arr[i], psum[i] = psum[i-1]+arr[i];
    if(m > sum) { printf("-1\n"); return 0; }
    sum = 0;
    for( ; lef<=n; ) {
        while(rig<=n && psum[rig]-psum[lef]<m) rig ++;
//      printf("%d %d %d\n", lef, rig, psum[rig]-psum[lef]);
        if(psum[rig]-psum[lef] >= m) ans = min(ans, rig-lef);
        lef ++;
    }
    printf("%d\n", ans);
 
 
 
 
 
 
#ifdef debug
    clock_t etime = clock();
    printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif
    return 0;
}

发表于 2019-11-24 17:29:58 回复(0)