小易有堆积木,第堆积木有块。小易还拥有一个容量无限的背包。
一开始小易站在第一堆积木旁边。每次小易可以选择进行下列三种操作中的一种:
1、从背包里掏出一块积木(如果有的话)放到当前这一堆里
2、从当前这一堆积木里掏出一块塞到背包里(如果当前积木堆不为空的话)
3、从当前这一堆走到下一堆。
一开始小易的背包里有块积木。小易希望把这些个积木变成严格递增的(即。小易希望知道这是否有可能能完成。(所有操作结束后不需要保证背包里没有积木了,可以有积木堆为空)。
第一行数据组数T对于每组数据,第一行数字,接下来一行个数字表示.
对于每组数据输出一行,输出结果YES或NO
1 5 3 2 2 3 3 1
YES
1 5 2 0 0 1 2 1
NO
1 5 3 2 2 3 3 1比如
noOfdata = int(input()) for _ in range(noOfdata): n, m = map(int, input().split(' ')) items = list(map(int, input().split(' '))) m += items[0] items[0] = 0 prevItem = items[0] ok = True for idx in range(1, len(items)): if items[idx] > idx: m += items[idx] - idx items[idx] = idx elif items[idx] == idx: prevItem = items[idx] elif items[idx] < idx: placeItems = idx - items[idx] if m >= placeItems: m -= placeItems items[idx] = idx else: ok = False break if ok: print("YES") else: print("NO")
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); while(T-- >0){ int n = sc.nextInt(), m = sc.nextInt(); int[] arr = new int[n]; for(int i = 0; i < n; i++) arr[i] = sc.nextInt(); System.out.println(solve(arr, m)); } } // 为了留下的积木少,积木堆就按照0,1,2,...的方式排 private static String solve(int[] arr, int m) { boolean flag = true; long bagHeapNum = m; for(int i = 0; i < arr.length; i++){ if(arr[i] > i) { bagHeapNum += arr[i] - i; }else if(arr[i] < i){ if(bagHeapNum >= i - arr[i]) bagHeapNum -= i - arr[i]; else return "NO"; } arr[i] = i; // 这一句可写可不写,因为并不需要返回调整后的积木堆数组,只要知道能否调整即可 } return "YES"; } }
T = int(input()) for _ in range(T): n, m = map(int, input().split()) h = list(map(int, input().split())) for i in range(n): put = i - h[i] m -= put if m < 0: print('NO') break h[i] += put if i == n-1: print('YES')
T = int(input()) def get(m, n, h): for i in range(n): if h[i] == i:continue if h[i] > i: m += h[i] - i else: if m >= i - h[i]: m -= i - h[i] else: return False return True for _ in range(T): n, m = map(int, input().split()) h = list(map(int, input().split())) res = get(m, n, h) if res: print('YES') else: print('NO')
var shunum = readline() for (let i = 0;i<shunum;i++){ for (let j=2*i;j<=2*i+1;j++){ var a = readline().split(' ') var h =[] if((j+2)%2 == 0){ n=parseInt(a[0]) k=parseInt(a[1]) }else{ for (let m=0;m<a.length;m++){ h[m]=parseInt(a[m]) } } } main(k,h) } function main(k,h){ var bag = k var success = true for (let p =0;p<h.length;p++){//循环积木堆的长度 if (h[p]>p){ bag = bag + h[p]-p }else{ if(bag >=(p-h[p])){ bag = bag-(p-h[p]) }else{ success = false continue } } } if(success == false){ return console.log('NO') }else{ return console.log('YES') } }
import java.util.Scanner; /** * 小易有n堆积木,第i堆积木有h{i}块。小易还拥有一个容量无限的背包。 * 一开始小易站在第一堆积木旁边。每次小易可以选择进行下列三种操作中的一种: * 1、从背包里掏出一块积木(如果有的话)放到当前这一堆里 * 2、从当前这一堆积木里掏出一块塞到背包里(如果当前积木堆不为空的话) * 3、从当前这一堆走到下一堆。 * 一开始小易的背包里有m块积木。小易希望把这些个积木变成严格递增的(即h_{1} < h_{2} < h_{3} \dots < h_{n}h1 * 。小易希望知道这是否有可能能完成。(所有操作结束后不需要保证背包里没有积木了,可以有积木堆为空)。 */ public class Question18 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); scanner.useDelimiter("\n"); int nums = scanner.nextInt(); while (nums > 0){ String next = scanner.next(); String[] split = next.split(" "); long m = Long.parseLong(split[1]); String value = scanner.next(); new Question18().answer(m, value); nums--; } } /** * 如果每组积木可以按严格递增排序,输出true 否则输出false * @param m 书包中积木的数量 * @param value 每组积木中每堆积木的数量 */ public void answer(long m, String value) { if (value.length() == 0){ System.out.println("NO"); return; } String result = ""; boolean isAdd = true; String[] split = value.split(" "); for (int i = 0; i < split.length; i++) { long temp = Long.parseLong(split[i]); m = m + temp - i; if (m < 0) { result = "NO"; isAdd = false; break; } } if (isAdd) { result = "YES"; } System.out.println(result); } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int i = 0; i < T;i++){ int n = sc.nextInt(); long m = sc.nextLong(); long sum = 0L; long s = 0L; for(int j = 0; j < n;j++){ sum += sc.nextLong(); s += j; long need = s - sum; if(need > 0L) m -= need; } if(m >= 0L) System.out.println("YES"); else System.out.println("NO"); } } }有没有大佬帮忙看一下为什么只能过60%
var num = parseInt(readline()) while(num--){ var arr = readline().split(" ") var n = parseInt(arr[0]) var k = parseInt(arr[1]) var h = readline().split(" ") for(var i=0;i<n;i++){ h[i] = parseInt(h[i]) } print(main(k,h)) } function main(k,h){ var bag = k var success = true for(let p = 0;p<h.length;p++){ if(h[p]>p){ bag = bag + h[p] - p }else{ if(bag >= (p-h[p])){ bag = bag-(p-h[p]) }else{ success = false continue } } } if(success == false){ return 'NO' }else{ return 'YES' } }
def f(nums, m): m += nums[0] nums[0] = 0 for j in range(1, len(nums)): if nums[j] > j: m += nums[j]-j elif nums[j] < j: if m >= j-nums[j]: m -= j-nums[j] else: return 'NO' nums[j] = j return 'YES' T = int(input()) for i in range(T): n, m = map(int, input().split()) nums = list(map(int, input().split())) print(f(nums, m))
#include <bits/stdc++.h> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--){ int n,m; cin>>n>>m; ll h; ll sum=m; int f=1; for(int i=0;i<n;i++){ cin>>h; if(sum+h>=i) { sum=sum+h-i; } else { f=0; } } if(f==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
#include<vector> (721)#include<iostream> using namespace std; int main() { int lines; cin >> lines; while (lines-- > 0) { int n, m; cin >> n >> m; vector<int>nums(n); unsigned long long sum = m; for (int i = 0; i < nums.size(); ++i) cin >> nums[i]; bool flag = true; int max = n * (n - 1) / 2; for (int i = 0; i < nums.size(); ++i) { sum += nums[i]; if (sum >= max)break; if (sum < i * (i + 1) / 2) { flag = false; break; } } cout << (flag ? "YES" : "NO") << endl; } }
import sys n = int(sys.stdin.readline().strip()) ns = [] ms = [] lists = [] for i in range(n): tmp = map(int, str(sys.stdin.readline().strip()).split()) ns.append(tmp[0]) ms.append(tmp[1]) tmp = map(int, str(sys.stdin.readline().strip()).split()) lists.append(tmp) for i in range(n): hs = lists[i] N = ns[i] M = ms[i] M+=hs[0] hs[0] = 0 flag = 1 for j in range(1,N): M += hs[j] - j if M<0: print('NO') flag = 0 break if flag: print('YES')
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Long t = scanner.nextLong(); for (int i = 0; i < t; i++) { Integer n = scanner.nextInt(); Long m = scanner.nextLong(); long[] arr = new long[n]; for (int i1 = 0; i1 < n; i1++) { arr[i1] = scanner.nextLong(); } System.out.println(demo4(m, arr)); } } /** * * * @param m m代表书包中初始积木输血量 * @param arr 代表n堆的积木数量 * @return */ public static String demo4(long m, long[] arr) { long sum1 = 0; long sum2 = 0; for (int i = 0; i < arr.length; i++) { //当前积木堆的最苛刻解数量总和即 0、1、2、3、4、5... sum1= (i * (i + 1)) / 2; //当前堆中的积木数量总和 sum2 += arr[i]; if (sum2 + m < sum1) { return "NO"; } } return "YES"; } }
t = int(input()) for _ in range(t): n, m = list(map(int, input().split())) li = list(map(int, input().split())) cur = m flag = True for i in range(n): if li[i] > i: cur += li[i] - i elif li[i] < i: if cur < i - li[i]: flag = False break cur -= i - li[i] if flag: print('YES') else: print('NO')
#include <cstdio> #include <cstring> #include <algorithm> #define MAX_N 100000+100 int T; int N; long long m; int H[MAX_N]; int main() { bool ok = true; scanf("%d", &T); while (T--) { scanf("%d%lld", &N, &m); ok = true; for (int i = 0; i < N; i++) { scanf("%d", &H[i]); } long long cur = -1; for (int i = 0; i < N; i++) { cur++; if (cur - H[i] > m) { ok = false; break; } m += (long long) H[i] - cur; } if (ok) printf("YES\n"); else printf("NO\n"); } return 0; }