A 直接判断就行
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
int n,x,y;
string s;
int main()
{
cin>>s;
if(s.size()>=6&&s[2]==s[3]&&s[4]==s[5]) cout<<"Yes";
else cout<<"No";
return 0;
}
B 先换500元的硬币再换5元的硬币
clude<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
int n,x,y;
int main()
{
cin>>n;
ll ans=0;
ans+=n/500*1000;
n%=500;
ans+=n/5*5;
cout<<ans;
return 0;
}
C 找相邻的两个之间距离的最大值,总长减去它就可以了,1和n之间需要特判
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
int n,x[N],y;
int main()
{
cin>>y>>n;
int ans=0;
for(int i=0;i<n;i++)
{
cin>>x[i];
ans=max(ans,x[i]-x[i-1]);
}
ans=max(ans,y+x[0]-x[n-1]);
cout<<y-ans;
return 0;
}
D 已知1到n相邻两个之间有一条边,还有x,y之间有条边,统计最短路分别长度为1到n的点对有多少,弗洛伊德求最短路一定是会超时的,仔细观察题意,只是多了一条边,那么任意i到j的最短路只会有两种情况(i<j),经过边(x,y)和不经过这条边,不经过很好求就是j-i,经过的还需要分情况:
一下只说经过边(x,y)的情况
如果i<x,x<j<y,最短路就是 (y-j)+(x-i)+1,(这个1就是边(x,y))
如果x<i,j<y,最短路是 (y-j)+(x-i)+1,
如果x<i<y,j>y,最短路就是(i-x)+(j-y)+1;
如果i<x,j>y 最短路是 (x-i)+(j-y)+1;
其他 情况下不经过边(x,y)就是最短了。所以将上面所有情况总结起来就是
min(j-i,abs(y-j)+abs(x-i)+1);
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2010;
int n,x,y,t[2100];
int main()
{
cin>>n>>x>>y;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
t[min(j-i,abs(j-y)+abs(x-i)+1)]++;
for(int i=1;i<n;i++) cout<<t[i]<<endl;
return 0;
}
E 将所有球放到一起降序排列,然后从大到小遍历,拿起红球的数量不超过x,绿球不超过y,无色无所谓,知道拿起x+y个球就结束了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
ll x,y,a,b,c,idx;
struct node
{
ll x,c;
}e[N];
bool cmp(node a,node b)
{
return a.x>b.x;
}
int main()
{
cin>>x>>y>>a>>b>>c;
for(int i=1;i<=a;i++) cin>>e[idx].x,e[idx++].c=1;
for(int i=1;i<=b;i++) cin>>e[idx].x,e[idx++].c=2;
for(int i=1;i<=c;i++) cin>>e[idx].x,e[idx++].c=3;
sort(e,e+idx,cmp);
int res1=0,res2=0,res3=0;
ll sum=0;
for(int i=0;i<idx;i++)
{
if(res1<x&&e[i].c==1)
{
res1++;
sum+=e[i].x;
}
if(res2<y&&e[i].c==2)
{
res2++;
sum+=e[i].x;
}
if(e[i].c==3) sum+=e[i].x,res3++;
if(res1+res2+res3==x+y) break;
}
cout<<sum;
return 0;
}