这道题是肥肠简单的题呢。

我的思路是以自己写作业的总时间为基础,找到最大的自己写时间与抄作业时间之差减去来使写作业变成抄作业。

我们在输入的时候维护 $tot1$ (抄作业的总时间)和 $tot2$ (自己写的总时间),如果输入过程中 $tot1>t$ 了直接输出-1退出程序就ok了。在输入的时候同时维护两个时间的差值,把抄作业的时间、自己写的时间和两个时间的差值都存在一个结构体内,快排一遍,然后从大往小减去时间差,直到 $tot2<t$ 为止。

另外,AtCoder 的题最后要有换行!!!!

废话不多说,上代码:

#include<bits/stdc++.h>
using namespace std;
int n,t,ans,tot1,tot2;                  //tot1是抄作业的总时间,tot2是自己写的总时间
const int maxn=1e5+1;
struct work{
    int copy,delta,finish;              //分别是抄作业的时间、自己写的时间和两个时间的差
}home[maxn];
bool cmp(work a,work b){
    return a.delta>b.delta;             //比较差值,差值大的靠前
}
int main(){
    ios::sync_with_stdio(false);        //读入优化
    cin>>n>>t;
    for(int i=1;i<=n;i++){
        cin>>home[i].finish>>home[i].copy;  
        home[i].delta=home[i].finish-home[i].copy;//维护两个时间之差
        tot1+=home[i].copy;             //维护tot1(抄作业的时间和)
        tot2+=home[i].finish;           //维护tot2(写作业的时间和)
        if(tot1>t){                     //如果抄作业都抄不完就直接退出
            cout<<-1<<endl;
            return 0;
        }
    }
    if(tot2<=t){                        //如果正常写可以写完就不用抄了
        cout<<0<<endl;
        return 0;
    }
    sort(home+1,home+n+1,cmp);          //按差值从大往小排序
    int pos=1;                          //进行到哪一个作业了
    while(tot2>t){                      
        tot2-=home[pos++].delta;        //减去差值,位置+1
        ans++;                          //给ans+1
    }
    cout<<ans<<endl;                    //输出答案
    return 0;
}