Codeforces Edu60 题解报告
2019-02-24 本文已影响3人
海天一树X
题目
http://codeforces.com/contest/1117
A
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int a[n];
int mx = 0;
for(int i = 0; i < n; i++)
{
cin >> a[i];
if(a[i] > mx)
{
mx = a[i];
}
}
int cnt = 0;
int ans = 0;
for(int i = 0; i < n; i++)
{
if(mx == a[i])
{
cnt++;
if(cnt > ans)
{
ans = cnt;
}
}
else
{
cnt = 0;
}
}
cout << ans << endl;
return 0;
}
B
#include<bits/stdc++.h>
using namespace std;
long long c,n,m,k,i;
int main()
{
cin>>n>>m>>k;
int a[n];
for(i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
c=a[n-1]-a[n-2];
cout<<m*a[n-1]-(m/(k+1))*c;
return 0;
}
C
分析:
本题可将风吹动船的运动轨迹和船本身的运动轨迹分开来看。以样例1为例。
- 假如经过的时间为10天,则风会将船吹到(0,10)的位置。(0,10)与终点(4,6)的曼哈顿距离(即横方向的距离加上竖方向的距离)为|4 - 0| + |6 - 10| = 8。现在考虑船的运动轨迹,在10天的时间内,船本身可以运动的最大的曼哈顿的距离是10。8 < 10,所以船只需要运动8天就可以到达终点,剩余两天的时间船可以保持不变。
- 假如经过的时间为5天,则风会将船吹到(0,5)的位置。(0,5)与终点(4,6)的曼哈顿距离为|4 - 0| + |6 - 5| = 5。现在考虑船的运动轨迹,在5天的时间内,船本身可以运动的最大的曼哈顿的距离是5。所以船运动5天后恰巧可以到达终点。
- 假如经过的时间为2天,则风会将船吹到(0,2)的位置。(0,2)与终点(4,6)的曼哈顿距离为|4 - 0| + |6 - 2| = 8。现在考虑船的运动轨迹,在2天的时间内,船本身可以运动的最大的曼哈顿的距离是2。所以2天的时间不可能到达终点。
通过上面三种情况可以看出,答案一定不是2天,也一定不是10天。但是咱们无法确定5天符合不符合题意。假如4天船能到达终点,则5天不是最少的时间。如果4天船无法到达终点,则5天是最少的时间,即5天为最终的答案。
如何确定最小的时间呢?可以使用二分法。考虑到本题的数据很大,需要初始化一个很大的数right = 1e18(即10^18)天,并初始化left = 0天。取mid = (left + right) / 2。如果mid天内船能到达终点,则把right更新为mid,这样就能减少下一次mid的值。如果mid天内船不能到达终点,则把left更新为mid,这样就能增加下一次mid的值。这样最终就能得到最小的天数。
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N = 100009;
pair<int, int> startP, endP;
int n;
string wind;
string dir = "UDLR"; //四个方向:0对应U, 1对应D,2对应L,3对应R
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
pair<int, int> d[N];
int main()
{
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
cin >> startP.x >> startP.y >> endP.x >> endP.y;
cin >> n >> wind;
for(int i = 0; i < n; ++i)
{
int id = -1;
for(int j = 0; j < 4; ++j)
{
if(dir[j] == wind[i])
{
id = j;
}
}
assert(id != -1);
d[i + 1] = make_pair(d[i].x + dx[id], d[i].y + dy[id]);
}
long long l = 0, r = 1e18;
while(r - l > 1)
{
long long mid = (l + r) / 2;
long long cnt = mid / n, rem = mid % n;
long long x = startP.x + d[rem].x + cnt * 1LL * d[n].x;
long long y = startP.y + d[rem].y + cnt * 1LL * d[n].y;
long long dist = abs(x - endP.x) + abs(y - endP.y);
if(dist <= mid)
{
r = mid;
}
else
{
l = mid;
}
}
if(r > 5e17)
{
r = -1;
}
cout << r << endl;
return 0;
}
TopCoder & Codeforces & AtCoder交流QQ群:648202993
中小学信息学竞赛咨询请加微信307591841
信息学竞赛公众号.jpg