比赛链接:ABC365
#include <bit/stdc++.h>
using namespace std;
int main(){
int Y;
cin>>Y;
if(Y%4!=0){
cout<<365<<endl;
return 0;
}
if(Y%4==0 && Y%100!=0){
cout<<366<<endl;
return 0;
}
if(Y%100==0 && Y%400!=0){
cout<<365<<endl;
return 0;
}
cout<<366<<endl;
return 0;
}
注意审题,要求输出的是下标。
#include <bits/stdc++.h>
using namespace std;
struct element{
int idx;
int val;
}A[105];
bool cmp(element x,element y){
return x.val>y.val;
}
int main(){
int N;
cin>>N;
for(int i=1;i<=N;i++){
cin>>A[i].val;
A[i].idx=i;
}
sort(A+1,A+N+1,cmp);
cout<<A[2].val<<endl;
return 0;
}
首先,特判 infinite 的情况,也就是数组的总和比小。然后我们二分,也就是最后的答案即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
long long A[maxn],sum[maxn],M,tot;
int N;
bool check(int x){
long long cnt=0;
for(int i=1;i<=N;i++)
cnt+=min((long long)x,A[i]);
if(cnt<=M)
return true;
return false;
}
int main(){
cin>>N>>M;
for(int i=1;i<=N;i++){
cin>>A[i];
tot+=A[i];
sum[i]=sum[i-1]+A[i];
}
int l=0,r=1e9;
while(l<r){
int mid=(l+r+1)>>1;
if(check(mid))
l=mid;
else
r=mid-1;
}
cout<<l<<endl;
return 0;
}
爆搜应该会 TLE,所以我们用 dp 实现。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int dp[maxn][3],move[maxn];
int main(){
int N;
string S;
cin>>N>>S;
for(int i=0;i<N;i++){
if(S[i]=='S')
move[i]=1;
else if(S[i]=='R')
move[i]=2;
else
move[i]=3;
}
for(int i=0;i<n;i++){
for(int j=1;j<=3;j++){
if((3+move[i]-j)%3==1)
dp[i][j]=-1;
else{
if((3+j-move[i])%3==1)
dp[i][j]=max(dp[i][j],max(dp[i-1][j%3+1]+1,dp[i-1][(j+1)%3+1]+1));
else
dp[i][j]=max(dp[i-1][j%3+1],dp[i-1][(j+1)%3+1]);
}
}
}
cout<<max(dp[N-1][1],max(dp[N-1][2],dp[N-1][3]))<<endl;
return 0;
}
上分了,开心.jpg。
友情提醒:不要Ctrl C+Ctrl V