4 solutions

  • 1
    @ 2024-7-27 11:40:17
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=1e7+10;
    int n,m;
    int r[N],d[N],s[N],t[N];
    LL b[N];
    bool check(int k)
    {
    	for(int i=1;i<=n;i++)  //计算差分
       {
          b[i]=r[i]-r[i-1];
       }
    	for(int i=1;i<=k;i++) //处理前k个任务
       {
    		b[s[i]]-=d[i];
    		b[t[i]+1]+=d[i];
    	}
    	LL res=0;
    	for(int i=1;i<=n;i++)
       {
    		res+=b[i];
    		if(res<0)
          {
             return true; //某一天的任务不够
          }
    	}
    	return false; //任务可以满足
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++) 
       {
          cin>>r[i]; //r[i]可以使用的教室数量
       }
    	for(int i=1;i<=m;i++) 
       {
          cin>>d[i]>>s[i]>>t[i]; //获取第i个任务的个数,起点,终点
       }
    	int l=1,r=m;
    	while(l<r) //枚举当前的任务个数
       {
    		int mid=l+r>>1;
    		if(check(mid))
          {
             r=mid; //1...mid个任务不能满足
          }
    		else
          {
             l=mid+1; //1...mid可以满足
          } 
    	}
    	if(check(r))
       {
          cout<<-1<<endl<<r;
       }
    	else
       {
          cout<<0;
       }
    	return 0;
    }
    
    • 1
      @ 2024-7-27 11:10:12
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=1e7+10;
      int n,m;
      int r[N],d[N],s[N],t[N];
      LL b[N];
      bool check(int k)
      {
      	for(int i=1;i<=n;i++)  //计算差分 
          {
              b[i]=r[i]-r[i-1];
          }
      	for(int i=1;i<=k;i++) //处理前k个任务 
          {
      		b[s[i]]-=d[i];
      		b[t[i]+1]+=d[i];
      	}
      	LL res=0;
      	for(int i=1;i<=n;i++)
          {
      		res+=b[i];
      		if(res<0) return true; //某一天的任务不够 
      	}
      	return false; //任务可以满足 
      }
      int main()
      {
      	scanf("%d%d",&n,&m);
      	for(int i=1;i<=n;i++) 
          {
              scanf("%d",&r[i]); //r[i]可以使用的教室数量 
          }
      	for(int i=1;i<=m;i++) 
          {
              scanf("%d%d%d",&d[i],&s[i],&t[i]); //获取第i个任务的个数,起点,终点 
          }
      	int l=1,r=m;
      	while(l<r) //枚举当前的任务个数 
          {
      		int mid=l+r>>1;
      		if(check(mid)) r=mid; //1...mid个任务不能满足 
      		else l=mid+1; //1...mid可以满足 
      	}
      	if(check(r)) printf("-1 \n%d",r);
      	else printf("0");
      	return 0;
      }
      
      
      
      • -1
        @ 2024-7-12 10:04:33
        #include<bits/stdc++.h>
        using namespace std;
        typedef long long LL;
        const int N=1e7+10;
        int n,m;
        int r[N],d[N],s[N],t[N];
        LL b[N];
        bool check(int k)
        {
        	for(int i=1;i<=n;i++) 
            {
                b[i]=r[i]-r[i-1];
            }
        	for(int i=1;i<=k;i++)
            {
        		b[s[i]]-=d[i];
        		b[t[i]+1]+=d[i];
        	}
        	LL res=0;
        	for(int i=1;i<=n;i++)
            {
        		res+=b[i];
        		if(res<0) return true;
        	}
        	return false;
        }
        int main()
        {
        	scanf("%d%d",&n,&m);
        	for(int i=1;i<=n;i++) 
            {
                scanf("%d",&r[i]);
            }
        	for(int i=1;i<=m;i++) 
            {
                scanf("%d%d%d",&d[i],&s[i],&t[i]);
            }
        	int l=1,r=m;
        	while(l<r)
            {
        		int mid=l+r>>1;
        		if(check(mid)) r=mid;
        		else l=mid+1;
        	}
        	if(check(r)) printf("-1 \n%d",r);
        	else printf("0");
        	return 0;
        }
        
        
        • -2
          @ 2024-4-17 18:57:48
          #include<bits/stdc++.h>
          using namespace std;
          typedef long long LL;
          const int N=1e7+10;
          int n,m;
          int r[N],d[N],s[N],t[N];
          LL b[N];
          bool check(int k)
          {
          	for(int i=1;i<=n;i++) 
              {
                  b[i]=r[i]-r[i-1];
              }
          	for(int i=1;i<=k;i++)
              {
          		b[s[i]]-=d[i];
          		b[t[i]+1]+=d[i];
          	}
          	LL res=0;
          	for(int i=1;i<=n;i++)
              {
          		res+=b[i];
          		if(res<0) return true;
          	}
          	return false;
          }
          int main()
          {
          	scanf("%d%d",&n,&m);
          	for(int i=1;i<=n;i++) 
              {
                  scanf("%d",&r[i]);
              }
          	for(int i=1;i<=m;i++) 
              {
                  scanf("%d%d%d",&d[i],&s[i],&t[i]);
              }
          	int l=1,r=m;
          	while(l<r)
              {
          		int mid=l+r>>1;
          		if(check(mid)) r=mid;
          		else l=mid+1;
          	}
          	if(check(r)) printf("-1 \n%d",r);
          	else printf("0");
          	return 0;
          }
          
          • 1

          Information

          ID
          198
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          5
          Tags
          # Submissions
          25
          Accepted
          5
          Uploaded By