[题目链接]:http://codeforces.com/contest/1117
题外话: 现在弱鸡一枚,后面的难题将来能力提升再补
A. Best Subsegment(签到题)
题意: 使得某段连续区间平均值最大的区间最长
思路: 一开始我的思路是前缀和,然后枚举区间复杂度O(n^2),这肯定TLE,仔细一想这不就是求整个区间的最大值有多少个相连
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
double a[N];
int main()
{
int n;
scanf("%d",&n);
double num,maxx=0;
for(int i=1;i<=n;i++)
{
scanf("%lf",&a[i]);
if(a[i]>=maxx)
maxx=a[i];
}
int cnt=1,ans=1;
for(int i=1;i<n;i++)
{
if(a[i]==maxx&&a[i+1]==maxx)
{
cnt++;
ans=max(cnt,ans);
}
else {
cnt=1;
}
}
cout<<ans<<endl;
return 0;
}
B.Emotes(贪心)
题意: 给出n个不同的表情,以及每个表情带来的开心值,求m个表情最多带来多少开心值,且相同的表情不能连续出现超过k次
思路: 找出开心值最大与第二大的表情,然后按照k个最大的表情+1个第二大的表情,总共循环m/(k+1)次
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
int a[N];
int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
ll tmp1=a[n],tmp2=a[n-1];
ll sum=tmp1*k+tmp2;
ll cnt=m/(k+1);
ll ans=cnt*sum+m%(k+1)*tmp1;
cout<<ans<<endl;
return 0;
}
C. Magic Ship(二分)
题意: 给定一艘船的起点与终点,与给定一个刮风的方向字符串,刮风的天气不断循环
思路: 二分需要的天数,若是直到循环结束右边界一直不变,则无法到达
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5;
char a[N];
int dx[N],dy[N];
int main()
{
ll x1,y1,x2,y2,n;
cin>>x1>>y1>>x2>>y2>>n;
cin>>a+1;
for(int i=1;i<=n;i++)
{
if(a[i]=='U')dx[i]=dx[i-1],dy[i]=dy[i-1]+1;
else if(a[i]=='D')dx[i]=dx[i-1],dy[i]=dy[i-1]-1;
else if(a[i]=='L')dx[i]=dx[i-1]-1,dy[i]=dy[i-1];
else if(a[i]=='R')dx[i]=dx[i-1]+1,dy[i]=dy[i-1];
}
ll l=0,r=1e18;
ll mid,tx,ty;
while(l<r)
{
mid=(l+r)/2;
tx=mid/n*dx[n]+dx[mid%n];
ty=mid/n*dy[n]+dy[mid%n];
if(abs(x2-x1-tx)+abs(y2-y1-ty)<=mid)
r=mid;
else l=mid+1;
}
if(r==1e18)
cout<<"-1"<<endl;
else cout<<r<<endl;
return 0;
}
D E F G待补…………