UVa 10382 Watering Grass
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 10001;
struct line
{
double l,r;
bool operator < (const line &x) const
{
return x.l > l;
};
} spring[MAXN];
int n,l,w;
int main()
{
while (scanf("%d%d%d",&n,&l,&w) !=EOF)
{
for (int i=1;i<=n;i++)
{
int locate,r;
scanf("%d%d",&locate,&r);
double delta = sqrt((double)(r*r-w*w/4.0));
spring[i].l = locate-delta;
spring[i].r = locate+delta;
}
sort(spring+1,spring+n+1);
double divide = 0,temp = 0;
int point = 1,ans = 0;
while (point <= n)
{
if (spring[point].l > divide) break;
while (spring[point].l <= divide && point <= n)
{
if (spring[point].r > temp) temp = spring[point].r;
point++;
}
ans++;
divide = temp;
if (divide >= l) break;
}
if (divide < l) printf("-1\n");else printf("%d\n",ans);
}
return 0;
}
UVa 10905 Children's Game
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
const int MAXN = 51;
int n;
string data[MAXN];
bool cmp(string a,string b)
{
return a+b > b+a;
}
int main()
{
while (scanf("%d",&n) == 1 && n)
{
for (int i=1;i<=n;i++) cin >> data[i];
sort(data+1,data+n+1,cmp);
for (int i=1;i<=n;i++) cout << data[i];
cout << endl;
}
return 0;
}
LA 4254 Processor
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
const int MAXN = 10001;
const int INF = 10000001;
struct Node
{
double r,d,w;
bool operator < (const Node &x) const
{
return d > x.d;
}
} data[MAXN];
int n,t;
bool cmp(Node x,Node y)
{
return x.r < y.r;
}
bool solve(int speed)
{
priority_queue <Node> Heap;
double now_time = data[1].r;
for (int i=1;i<=n;i++)
{
now_time = max(now_time,data[i].r);
Heap.push(data[i]);
while (now_time < data[i+1].r && !Heap.empty())
{
Node x = Heap.top();Heap.pop();
if (x.d < now_time+(x.w/speed)) return false;
if ((double)x.w/speed <= (data[i+1].r-now_time)) now_time += (double)x.w/speed;
else
{
x.w -= speed*(data[i+1].r-now_time);
Heap.push(x);
now_time = data[i+1].r;
}
}
}
return true;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
memset(data,0,sizeof(data));
for (int i=1;i<=n;i++) scanf("%lf%lf%lf",&data[i].r,&data[i].d,&data[i].w);
int min_speed = 0, max_speed = 1000001;
data[n+1].r = INF;
sort(data+1,data+n+1,cmp);
while (min_speed+1 != max_speed)
{
int mid = (min_speed+max_speed)/2;
if (solve(mid)) max_speed = mid;
else min_speed = mid;
}
printf("%d\n",max_speed);
}
return 0;
}
UVa 11134 Fabled Rooks
#include <iostream>
#include <cstdio>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 5001;
struct range
{
int l,r,id;
bool operator < (const range &x) const
{
return (l > x.l) || ((l == x.l) && (r > x.r));
}
} horizontal[maxn],vertical[maxn];
int n;
int ans[maxn][2];
bool check(range *line,int pos)
{
priority_queue<range> Q;
for (int i=1;i<=n;i++) Q.push(line[i]);
int MAX_X = 0;
while (!Q.empty())
{
range x = Q.top();Q.pop();
if (x.r < MAX_X) return false;
if (x.l < MAX_X)
{
x.l = MAX_X;
Q.push(x);
continue;
}
int cur = max(x.l,MAX_X);
ans[x.id][pos] = cur;
MAX_X = cur+1;
}
return true;
}
int main()
{
while (scanf("%d",&n) && n)
{
for (int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&horizontal[i].l,&vertical[i].l,&horizontal[i].r,&vertical[i].r);
horizontal[i].id = vertical[i].id = i;
}
if (check(horizontal,0) && check(vertical,1))
for (int i=1;i<=n;i++) printf("%d %d\n",ans[i][0],ans[i][1]);
else printf("IMPOSSIBLE\n");
}
return 0;
}
UVa 11100 The Trip
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define ms(a, i, n) memset(a, i, sizeof(a[0]) * (n))
const int MAXN = 1000100;
int n, a[MAXN], Max, cnt, cas;
bool flag, vis[MAXN];
int main() {
cas = 0;
while (scanf("%d", &n) && n) {
rep(i, n) scanf("%d", &a[i]);
sort(a, a + n);
Max = cnt = 1;
rep(i, n - 1) {
if (a[i] == a[i + 1]) cnt++;
else cnt = 1;
if (Max < cnt) Max = cnt;
}
ms(vis, 0, n);
if (cas) printf("\n");
printf("%d\n", Max);
int i;
cnt = 0;
while (1) {
if (cnt >= n) break;
for (i = 0; i < n; i++)
if( !vis[i]) break;
cnt++;
vis[i] = true;
printf("%d", a[i]);
i += Max;
for (; i < n; i += Max)
if (!vis[i]) {
printf(" %d", a[i]);
vis[i] = true;
cnt++;
}
printf("\n");
}
}
return 0;
}
LA 3266
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1001;
int n;
int TJ[MAXN],QW[MAXN];
int main()
{
while (scanf("%d",&n) && n)
{
for (int i=1;i<=n;i++) scanf("%d",&TJ[i]);
for (int i=1;i<=n;i++) scanf("%d",&QW[i]);
sort(TJ+1,TJ+n+1);sort(QW+1,QW+n+1);
int win = 0, fail = 0;
int i_Begin = 1, j_Begin = 1, i_End = n, j_End = n;
while (i_Begin <= i_End)
{
if (TJ[i_End] < QW[j_End])
{
fail++;
i_Begin++;
j_End--;
}
else if (TJ[i_End] > QW[j_End])
{
win++;
i_End--;
j_End--;
}
else
{
if (TJ[i_Begin] > QW[j_Begin])
{
win++;
i_Begin++;
j_Begin++;
}
else
{
if (TJ[i_Begin] < QW[j_End]) fail++;
i_Begin++;
j_End--;
}
}
}
printf("%d\n",200*(win-fail));
}
return 0;
}
UVa 11389
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 101;
int n,d,r;
int a[MAXN],b[MAXN];
int main()
{
while (scanf("%d%d%d",&n,&d,&r) && n+d+r)
{
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
sort(a+1,a+n+1);sort(b+1,b+n+1);
int cost = 0;
for (int i=1;i<=n;i++)
if (a[i]+b[n-i+1] > d) cost += (a[i]+b[n-i+1]-d)*r;
printf("%d\n",cost);
}
return 0;
}