A. Joysticks
传送门
模拟就行了,
每次都先给电量少的充电,直到另一个的电量不足以多使用1minute,
#include <bits/stdc++.h>
#define ll long long
#define N 100
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt", "r", stdin);
#endif
int i, j, k;
int a1, a2, ans = 0, t;
cin >> a1 >> a2;
while(a1 > 0 && a2 > 0)
{
if (a1 < a2) swap(a1, a2);
t = a1/2;
if (a1 == 2)
{
ans++;
break;
}
if (a1&1)
{
a2 += t;
a1 = 1;
}
else
{
t--;
a1 = 2;
a2 += t;
}
ans += t;
if (a1 < 2 && a2 < 2) break;
}
cout << ans;
return 0;
}
B. Beautiful Paintings
#include <bits/stdc++.h>
#define ll long long
#define N 1010
using namespace std;
set<int> s[N];
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt", "r", stdin);
#endif
int i, j, k, t;
int n, ans;
for (i = 0; i < 1000; i++) s[i].clear();
cin >> n;
for (i = 0; i < n; i++)
{
cin >> t;
for (j = 0; j < 1000; j++)
{
if (s[j].find(t) == s[j].end())
{
s[j].insert(t);
break;
}
}
}
ans = 0;
for (i = 0; i < 1000; i++)
{
t = s[i].size();
ans += t?t-1:0;
}
cout << ans;
return 0;
}
C. Watchmen
这道题竟然在终测的时候爆int了 /(ㄒoㄒ)/~~
map<int, int>应该改成map<long long, long long>,这样直接就AC了
这道题的意思就是找有多少对坐标对满足曼和顿距离和欧几里得距离相等,满足这种条件的坐标对都在同一条直线上。
用map计算就行了
#include <bits/stdc++.h>
#define ll long long
#define N 200010
using namespace std;
struct point{
int x, y;
}node[N];
bool cmp_x(point a, point b)
{
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
map<ll,ll> mx, my;
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif
int i, j, k, n, xx, yy;
ll ans = 0, t, tmp;
map<ll,ll>::iterator it;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d%d", &node[i].x, &node[i].y);
if (mx.find(node[i].x) == mx.end())
{
mx.insert(pair<ll,ll>(node[i].x, 1));
}
else
{
mx[node[i].x]++;
}
if (my.find(node[i].y) == my.end())
{
my.insert(pair<ll,ll>(node[i].y, 1));
}
else
{
my[node[i].y]++;
}
}
for (it = mx.begin(); it != mx.end(); it++)
ans += (it->second)*((it->second)-1)/2;
for (it = my.begin(); it != my.end(); it++)
ans += it->second*(it->second-1)/2;
sort(node, node+n, cmp_x);
t = 1;
for (i = 1; i < n; i++)
{
if (node[i].x == node[i-1].x && node[i].y == node[i-1].y)
{
t++;
}
else
{
ans -= t*(t-1)/2;
t = 1;
}
}
ans -= t*(t-1)/2;
cout << ans;
return 0;
}
D. Image Preview
#include <bits/stdc++.h>
#define ll long long
#define N 500010
using namespace std;
int n, a, b, t;
int num[N]; //前i个数有多少需要旋转的
int is[N];
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt", "r", stdin);
#endif
char c;
scanf("%d%d%d%d", &n, &a, &b, &t);
getchar();
for (int i = 0; i < n; i++)
{
scanf("%c", &c);
is[i] = (c == 'w');
num[i] = is[i];
if (i) num[i] += num[i-1];
}
if (is[0]*b+1 > t)
{
cout << 0;
return 0;
}
int l = 0, sum = 0; //从第一个想第n个开始看
for (; ; )
{
if (is[l]) sum += b;
sum++;
if (sum > t) break;
sum += a;
l = (l-1+n)%n;
if (!l) break; //全部都已经看完
}//如果一直向右看,可以看到l张,共看n-1-l+1张照片
if (!l)
{
cout << n;
return 0;
}
int ws, ans = n-1-l+1;//ws为需要旋转的照片的数量
for (int r = 1; r < n; r++)
{
ws = num[r];//0到r里面需要翻转的数量
ws += num[n-1] - num[l];//l到n-1里面需要翻转的数量
while(l && ws*b+r+1+(n-1-l)+a*(r+(n-1-l))+a*min(r, n-1-l) > t)
{
l = (l+1)%n;
ws = num[r];
ws += num[n-1]-num[l];
}
if (!l) break;
ans = max(ans, r+1+n-1-l);
}
cout << ans;
return 0;
}