DIET - Editorial

PROBLEM LINK:

Practice

Contest: Division 1

Contest: Division 2

Setter: Hasan
Tester: Teja Vardhan Reddy
Editorialist: Taranpreet Singh

DIFFICULTY:

Cakewalk

PREREQUISITES:

None

PROBLEM:

Chef decided to go on a diet during the following N days (numbered 1 through N). Part of the diet plan is to eat K grams of protein each day. For each valid i, Chef wants to buy A_i grams of protein in the morning of the i-th day and then eat K grams of protein as part of his dinner. If he has any protein remaining, he can store it and use it in later dinners. Initially, Chef is storing 0 grams of protein.

Determine whether Chef will have enough protein all the time during his diet. In case he will not have enough, find the first day on which Chef will be unable to eat K grams of protein.

QUICK EXPLANATION

  • We can keep a single variable S denoting the number of grams of protein yet not consumed. Every day, we increase S by A_i and check if sufficient protein is available for that day or not.
  • If it is available for all days, the answer is YES, otherwise the answer is NO, and we print the first day when there’s not enough protein.

EXPLANATION

Let us denote the number of grams of proteins available, yet not consumed by S. We can see that now, buying proteins is simply increasing S by A_i and consuming K grams of proteins is represented by reducing S by K.

The condition of the availability of sufficient protein represents that S must be non-negative at all times.

Hence, our problem becomes, Given an array A of length N and K and we have S = 0 (No previous supplies of protein)

So, we can simulate the process for N days, first adding A_i and then subtracting K while making sure S remains non-negative. If it becomes negative, the first day it becomes negative is our answer.

TIME COMPLEXITY

The time complexity is O(N) per test case.

SOLUTIONS:

Setter's Solution
#include <iostream>
#include <algorithm>
#include <string>
#include <assert.h>
using namespace std;
 
 
 
long long readInt(long long l,long long r,char endd){
	long long x=0;
	int cnt=0;
	int fi=-1;
	bool is_neg=false;
	while(true){
		char g=getchar();
		if(g=='-'){
			assert(fi==-1);
			is_neg=true;
			continue;
		}
		if('0'<=g && g<='9'){
			x*=10;
			x+=g-'0';
			if(cnt==0){
				fi=g-'0';
			}
			cnt++;
			assert(fi!=0 || cnt==1);
			assert(fi!=0 || is_neg==false);
		
			assert(!(cnt>19 || ( cnt==19 && fi>1) ));
		} else if(g==endd){
			assert(cnt>0);
			if(is_neg){
				x= -x;
			}
			assert(l<=x && x<=r);
			return x;
		} else {
			assert(false);
		}
	}
}
string readString(int l,int r,char endd){
	string ret="";
	int cnt=0;
	while(true){
		char g=getchar();
		assert(g!=-1);
		if(g==endd){
			break;
		}
		cnt++;
		ret+=g;
	}
	assert(l<=cnt && cnt<=r);
	return ret;
}
long long readIntSp(long long l,long long r){
	return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
	return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
	return readString(l,r,'\n');
}
string readStringSp(int l,int r){
	return readString(l,r,' ');
}



int T;
int n,k;

int arr[111];
int main(){
	//freopen("00.txt","r",stdin);
	//freopen("00o.txt","w",stdout);
	T=readIntLn(1,200);
	while(T--){
		n=readIntSp(1,100);
		k=readIntLn(1,1000000);
		for(int i=0;i<n;i++){
			if(i==n-1){
				arr[i]=readIntLn(1,1000000);
			} else {
				arr[i]=readIntSp(1,1000000);
			}
		}
		int cur =0;
		int err=-1;
		for(int i=0;i<n;i++){
			cur += arr[i] - k;
			if(cur < 0){
				err = i;
				break;
			}
		}
		if(err == -1){
			cout<<"YES"<<endl;
		} else {
			cout<<"NO "<<err+1<<endl;
		}
	}
	assert(getchar()==-1);
}
Tester's Solution
//teja349
#include <bits/stdc++.h>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <utility>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <iomanip>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp> 
//setbase - cout << setbase (16); cout << 100 << endl; Prints 64
//setfill -   cout << setfill ('x') << setw (5); cout << 77 << endl; prints xxx77
//setprecision - cout << setprecision (14) << f << endl; Prints x.xxxx
//cout.precision(x)  cout<<fixed<<val;  // prints x digits after decimal in val

using namespace std;
using namespace __gnu_pbds;

#define f(i,a,b) for(i=a;i<b;i++)
#define rep(i,n) f(i,0,n)
#define fd(i,a,b) for(i=a;i>=b;i--)
#define pb push_back
#define mp make_pair
#define vi vector< int >
#define vl vector< ll >
#define ss second
#define ff first
#define ll long long
#define pii pair< int,int >
#define pll pair< ll,ll >
#define sz(a) a.size()
#define inf (1000*1000*1000+5)
#define all(a) a.begin(),a.end()
#define tri pair<int,pii>
#define vii vector<pii>
#define vll vector<pll>
#define viii vector<tri>
#define mod (1000*1000*1000+7)
#define pqueue priority_queue< int >
#define pdqueue priority_queue< int,vi ,greater< int > >
#define flush fflush(stdout) 
#define primeDEN 727999983
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

// find_by_order()  // order_of_key
typedef tree<
int,
null_type,
less<int>,
rb_tree_tag,
tree_order_statistics_node_update>
ordered_set;

int a[1234];
int main(){
	std::ios::sync_with_stdio(false); cin.tie(NULL);
	int t;
	cin>>t;
	while(t--){
		int n,k;
		cin>>n>>k;
		int i;
		int val,ans=0;
		rep(i,n){
			cin>>a[i];
		}
		rep(i,n){
			ans+=a[i];
			ans-=k;
			if(ans<0){
				break;
			}
		}
		if(i==n){
			cout<<"YES"<<endl;
		}
		else{
			cout<<"NO"<<" "<<i+1<<endl;
		}
		int j;
	}
	return 0;   
}
Editorialist's Solution
import java.util.*;
import java.io.*;
import java.text.*;
class DIET{
	//SOLUTION BEGIN
	void pre() throws Exception{}
	void solve(int TC) throws Exception{
	    int n = ni(), k = ni();
	    long[] a = new long[1+n];
	    for(int i = 1; i<= n; i++)a[i] = ni()+a[i-1];
	    int ans = n+1;
	    for(int i = 1; i<= n; i++){
	        if(a[i] < i*k){ans = i;break;}
	    }
	    if(ans == n+1)pn("YES");
	    else pn("NO "+ans);
	}
	//SOLUTION END
	void hold(boolean b)throws Exception{if(!b)throw new Exception("Hold right there, Sparky!");}
	DecimalFormat df = new DecimalFormat("0.00000000000");
	static boolean multipleTC = true;
	FastReader in;PrintWriter out;
	void run() throws Exception{
	    in = new FastReader();
	    out = new PrintWriter(System.out);
	    //Solution Credits: Taranpreet Singh
	    int T = (multipleTC)?ni():1;
	    pre();for(int t = 1; t<= T; t++)solve(t);
	    out.flush();
	    out.close();
	}
	public static void main(String[] args) throws Exception{
	    new DIET().run();
	}
	int bit(long n){return (n==0)?0:(1+bit(n&(n-1)));}
	void p(Object o){out.print(o);}
	void pn(Object o){out.println(o);}
	void pni(Object o){out.println(o);out.flush();}
	String n()throws Exception{return in.next();}
	String nln()throws Exception{return in.nextLine();}
	int ni()throws Exception{return Integer.parseInt(in.next());}
	long nl()throws Exception{return Long.parseLong(in.next());}
	double nd()throws Exception{return Double.parseDouble(in.next());}

	class FastReader{
	    BufferedReader br;
	    StringTokenizer st;
	    public FastReader(){
	        br = new BufferedReader(new InputStreamReader(System.in));
	    }

	    public FastReader(String s) throws Exception{
	        br = new BufferedReader(new FileReader(s));
	    }

	    String next() throws Exception{
	        while (st == null || !st.hasMoreElements()){
	            try{
	                st = new StringTokenizer(br.readLine());
	            }catch (IOException  e){
	                throw new Exception(e.toString());
	            }
	        }
	        return st.nextToken();
	    }

	    String nextLine() throws Exception{
	        String str = "";
	        try{   
	            str = br.readLine();
	        }catch (IOException e){
	            throw new Exception(e.toString());
	        }  
	        return str;
	    }
	}
}

Feel free to share your approach. Suggestions are welcomed as always. :slight_smile:

2 Likes

Pay very close attention to the output format - you’re printing out the answers slightly wrongly :slight_smile:

1 Like

still struggling to find it…
can you please explain it more

1 Like

Here’s the expected output for the sample testcase:

YES
NO 1
NO 3

What does your solution print out for that testcase? Is it a perfect match?

1 Like

Now i understand the problem.
I was using lower case but it was required upper case character only.
Thanks @ssjgz

1 Like

#include
using namespace std;

int main() {
int t;
cin>>t;
while(t–)
{
int n,i;
long int k,a[n],sum=0;
cin>>n>>k;
for(i=0;i<n;i++)
{
cin>>a[i];
}
for(i=0;i<n;i++)
{
a[i]+=sum;
if(a[i]<k)
{
break;
}
else
{
sum=a[i]-k;
}
}
if(i==n)
{
cout<<“Yes”;
}
else
{
cout<<“No”<<" "<<i;
}
cout<<endl;
}
return 0;
}

I don’t understand why this code is not working…can anyone explain me pls…

thanks :slightly_smiling_face:,silly mistake

1 Like

**I am getting correct output for every custom testcase as well as the example testcases, but getting a “WA” after submission. **
Please let me know my fault :slight_smile:

#include
#define max 100
using namespace std;

int main() {
// your code goes here
int t;
cin>>t;

while(t--)
{
    long long int n,k,a[max],temp,flag=0;
    cin>>n>>k;
    for(int i=0;i<n;i++)
    cin>>a[i];
    for(int i=0;i<n;i++)
    {
        if(a[i]>=k)
        {
	        temp=a[i]-k;
            a[i+1]+=temp;
            flag+=1;
        }
        else if(a[i]<k)
        cout<<"NO"<<" "<<i+1<<endl;
        if(flag==n)
        cout<<"YES"<<endl;
    }	    
    
}
return 0;

}

I am also getting WA while given inputs are giving correct output.
import java.util.Scanner;
class Codechef
{
public static void main(String []args)
{
Scanner sc=new Scanner(System.in);
int t=sc.nextInt();
while(t-- >0)
{
int N=sc.nextInt();
int K=sc.nextInt();
int R=0;
int C=0;
int L=0;
int [] A=new int[N];
for(int i=0;i<N;i++)
{
A[i]=sc.nextInt();
}

        for(int p=0;p<N;p++)
        {
            R=A[p]+R;
            if(R==K)
            {
                R=R+0;
                C=C+1;

            }
            else if(R>K)
            {
                R=R-K;
                C=C+1;
            }
            else if(R<K)
            {
                L=L+(p+1);
                break;
            }
        }
        if(C==N && L==0)
        {
            System.out.println("YES");
        }
        else if(C!=N && L!=0)
        {
            System.out.println("NO"+ " " +L);
        }
    }

}

}

include iostream

using namespace std;
int main()
{
int T;
cin >> T;
int rem = 0;
int ans = 0;
for (int i = 0; i < T; i++)
{
int N, K;
cin >> N >> K;
int arr[N];
for (int i = 0; i < N; i++)
{
cin >> arr[i];
}
for (int i = 0; i < N; i++)
{
arr[i] = arr[i] + rem;
if (arr[i] >= K)
{
ans = ans + 1;
rem = arr[i] - K;
}
else
{
ans = i;
break;
}
}
if (ans == N)
{
cout << “YES” << endl;
}
else
{
cout << "NO " << ans << endl;
}
}
return 0;
}
I am not getting correct value after the “NO” keyword. Can you please help me out !!!

Hey @aniruddha_2543 :smiling_face: ,
You haven’t break the condition when you print (“NO”) so after printing “NO” your program is still running , Break after the condition and it will work fine.