C. Frog Jumps
题意:
一只青蛙站在x轴0点,想要跳到第n+1个点。 青蛙可以跳任意次数,跳到L点只能向左跳,跳到R点只能向右跳,问所有跳跃中最大的值最小为多少?
思路:
贪心
青蛙跳到n+1个点之前一定在R或者原点处(没有R),青蛙如果去L再去R只会增大距离,所以青蛙只跳R的点并记录最大距离为多少即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
char s[maxn];
int L[maxn],R[maxn];
int cnt,tot;
int n;
void solve(){
cin>>s+1;
tot=0,cnt=0;
n=strlen(s+1);
for(int i=1;i<=n;i++){
if(s[i]=='L') L[++cnt]=i;
else {
R[++tot]=i;
}
}
if(tot==0){
cout<<n+1<<'\n';
return;
}
if(cnt==0){
cout<<1<<'\n';
return;
}
R[0]=0;
R[++tot]=n+1;
int res=0;
for(int i=0;i<tot;i++){
res=max(res,R[i+1]-R[i]);
}
cout<<res<<'\n';
return;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int T;cin>>T;
while(T--){
solve();
}
return 0;
}
D. Pair of Topics
题意:
思路:
ai−bi>bj−aj
设x[i]=ai−bi,则x[j]=bj−aj,求x[i]>−x[j]且i<j即求x[i]+x[j]>0且i<j
sort排个序,然后贪心遍历数组。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
int n;
int a[maxn],b[maxn];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
}
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
a[i]-=x;
}
sort(a+1,a+1+n);
ll res=0;
int pre=n;
for(int i=1;i<=n;i++){
while(pre>0&&a[pre]+a[i]>0) pre--;
res+=n-max(i,pre);
}
printf("%lld",res);
return 0;
}
E. Sleeping Schedule
题意:
Vova有一个奇怪的睡眠习惯,Vova会睡上刚好N次。第i次他会在他上一次醒来的a[i]个小时后睡觉。你可以假设Vova是在开头醒来的(初始时间是第0小时)。每次Vova刚好睡一天(换言之,h小时,这个h小时不是平时的24小时,题中会给出)。当他的第i次睡眠在l点和r点之间进行时被称之为好睡眠。它可以控制自己在第i次睡眠预定的a[i]小时后睡觉,也可以是在a[i]-1小时后。求这n次睡眠他的好睡眠最多可以有多少次?
思路:
DP
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
int n,h,l,r;
int a[3000];
ll f[3000][3000];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>h>>l>>r;
for(int i=1;i<=n;i++){
cin>>a[i];
}
memset(f,0xc0,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<h;j++){
f[i][j]=max(f[i][j], f[i-1][(j-a[i]+h)%h]+((j>=l && j<=r)?1:0));
f[i][j]=max(f[i][j], f[i-1][(j-a[i]+1+h)%h]+((j>=l && j<=r)?1:0));
}
}
ll res=0;
for(int i=0;i<h;i++){
res=max(res,f[n][i]);
}
cout<<res;
return 0;
}