Codeforces Round #610 (Div. 2)

A题

给两个范围,求不在第二个范围的第一个范围的点的个数

int main() {
    int q;
    cin >> q;
    while(q--) {
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        if(a > b) swap(a,b);
        int l = c-d;
        int r = c+d;
        int ans = 0;
        if(r<a||l>b) {
            cout << b - a << endl;
            continue;
        }
        if(l > a) ans += l - a;
        if(r < b) ans += b - r;
        cout << ans << endl;
    }
    return 0;
}

B题

总共有p个钱,有n件东西,可以一件一件买,也可以k件一块买,求最多可以买到多少件东西
从0到k-1都模拟出来和,求最大的

ll a[MAXN],b[MAXN];

int main() {
    int q,n,k;
    ll p;
    cin >> q;
    while(q--) {
        cin >> n >> p >> k;
        for(int i = 0; i <= k; i++) b[i] = 0;
        for(int i = 1; i <= n; i++) cin >> a[i];
        sort(a+1,a+n+1);
        int ans = 0;
        for(int i = 1; i < k; i++) {
            b[i] = b[i-1] + a[i];
            if(b[i] <= p) ans = i;
        }
        for(int i = 0; i < k; i++) {
            for(int j = i+k; j <= n; j+=k) {
                b[i] += a[j];
                if(b[i] <= p && j > ans) ans = j;
            }
        }
        cout << ans << endl;
    }
}

C题

参加考试,0代表容易题,解出需要a分钟,1代表难题,解出需要b分钟,可以从任意时间s退出考试,n个题目,每个题目有个限制时间ti,如果要从s时间退出考试则必须把ti<=s的全部题目做完,求最多可以做几个题目; 把时间排序,然后贪心,把需要做的难题做完,在最大的做简单题

struct node {
    ll ty,t;
}a[MAXN];

bool cmp(node a,node b) {
    return a.t < b.t;
}
ll sum[MAXN];

int main() {
    int q,n,t,b,c;
    cin >> q;
    while(q--) {
        cin >> n >> t >> b >> c;
        for(int i = 0; i < n; i++) cin >> a[i].ty;
        for(int i = 0; i < n; i++) cin >> a[i].t;
        sort(a,a+n,cmp);
        a[n].t = t+1;
        ll time = 0;
        int res = 0;
        for(int i = n-1; i >= 0; i--) {
            sum[i] = res;
            if(a[i].ty == 0) res++;
        }
        int ans = 0;
        if(a[0].t) ans = min((a[0].t-1)/b,sum[0]);
        res = 0;
        for(int i = 0; i < n; i++) {
            if(a[i].ty == 0) time += b;
            else time += c;
            if(time < a[i+1].t) {
                res = i+1; 
                res += min((a[i+1].t-time-1)/b,sum[i]);
                ans = max(ans,res);
            }
        }
        cout << ans << endl;
    }
    //system("pause");
    return 0;
}

听说有人想批斗我,没想到我早上去答辩了,哈哈哈哈

原文地址:https://www.cnblogs.com/ASLHZXY/p/12101959.html