T1

cpp
#include <iostream>
#include <algorithm>
using namespace std;
struct soider{
int B;
int J;
};
bool cmp(soider a,soider b){
return a.J>b.J;
}
soider a[1000010];
int n;
void solve(int n,int num){
for(int i=0;i<n;i++){
scanf("%d%d",&a[i].B,&a[i].J);
}
sort(a+0,a+n,cmp);
int t=0;
int work=0;
for(int i=0;i<n;i++){
t+=a[i].B;
if(work>a[i].B)
work-=a[i].B;
else
work=0;
work=max(a[i].J,work);
}
printf("Case %d:%d\n",num,t+work);
}
int main(){
scanf("%d",&n);
int cnt=1;
while(n>0){
solve(n,cnt);cnt++;
scanf("%d",&n);
}
return 0;
}
时间复杂度约为。
T2

cpp
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
struct soider {
double l;
double r;
};//用这个名字是因为省事
bool cmp(soider a, soider b) {
return a.l < b.l;
}
int d;
soider a[1000010];
int n;//[x-sqrt(d*d-y*y),x+sqrt(d*d+y*y)]
void solve(int num) {
scanf("%d", &d);
for (int i = 0; i < n; i++) {
int x;
int y;
scanf("%d%d", &x, &y);
if (d * d - y * y < 0) {
cout << "-1" << endl;
return;
}
a[i].l = x - sqrt(d * d - y * y);
a[i].r = x + sqrt(d * d - y * y);
//cout << 'l' << a[i].l << endl;
//cout << 'r' << a[i].r << endl;
}
sort(a + 0, a + n, cmp);
double p = a[0].r;
int cnt = 1;
int i = 0;
while (p <= a[n - 1].r && i < n) {
//cout<<"p:"<<p<<endl;
while (a[i].l <= p) {
i++;
//cout <<i<< " l " << a[i].r << endl;
//cout <<i<< " r " << a[i].r << endl;
}
p = a[i].r;
cnt++;
}
cout << cnt << endl;
}
int main() {
scanf("%d", &n);
solve(n);
return 0;
}
时间复杂度约为。