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;
}
听说有人想批斗我,没想到我早上去答辩了,哈哈哈哈