AtCoder Beginner Contest 160(A-E)

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; 
}
posted @ 2020-03-29 15:13  Neflidata  阅读(3)  评论(0编辑  收藏  举报