Educational Codeforces Round 85 (Rated for Div. 2)

A 直接判断就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie();
int t,n,a[N],b[N];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		bool flag=1;
		for(int i=0;i<n;i++)
		{
			cin>>a[i]>>b[i];
			if(b[i]>a[i]) flag=0;
			if(i)
			{
				if(a[i]<a[i-1]||b[i]<b[i-1]) flag=0;
				if(b[i]-b[i-1]>a[i]-a[i-1]) flag=0;
			}
		}
		if(flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

B 排序之后从大到小判断即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie();
int t,n,x,a[N],b[N];
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>x;
		bool flag=1;
		for(int i=0;i<n;i++)
			cin>>a[i];
		sort(a,a+n);
		ll sum=0,res=0;
		for(int i=n-1;i>=0;i--)
		{
			sum+=a[i];
			if(sum>=(1ll*(n-i)*x)) res++;
			else break;
		}
		cout<<res<<endl;
	}
	return 0;
}

C 每一个怪兽被打爆后都会对下一个怪兽产生爆炸伤害,这个爆炸伤害是可以计算的,我们一定要选择一个起点来打爆这个怪兽,之后继续朝下一个的方向打爆剩余的怪兽,这样就只有起点前一个的怪兽爆炸没有产生伤害,相当于这个爆炸伤害亏损了,如果选择多个起点会亏损多个爆炸伤害,就一定会比一个要多。所以只用枚举每个点假设它是起点,只会有前一个点回亏损爆炸伤害,所以代价就是总的血量减除了前一点以外的所有点爆炸伤害之和就是了,最后取一个最小值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie();
int t,n,x;
ll a[N],b[N],c[N];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=0;i<n;i++)
			scanf("%lld%lld",a+i,b+i);
		ll sum=0,sum1=0;
		for(int i=0;i<n;i++)
		{
			sum1+=a[i];//总血量 
			c[i]=min(b[i],a[(i+1)%n]);//当前点的伤害
			sum+=c[i];//总伤害 
		}
		ll ans=1e18;
		for(int i=0;i<n;i++)
			ans=min(ans,sum1-sum+c[(i-1+n)%n]);
		printf("%lld\n",ans);
	}
	return 0;
}

D 已知一个完全图,要求输出字典序最小的欧拉回路(每条边都经过一次,点无所谓),对完全图来说欧拉回路是一定存在的,既然要找字典序最小的欧拉回路,就让每一个点都走向可以走的最小点。
从1出发就走向2,2再走向最小的1,再走向3,再回到1;
直到走点n时不能回到1不然就不是欧拉回路,只能走向2了,然后最小的点就3(1到2的两条边都已经走过了),然后再回到最小的2,再走向4,再回到2;
直到回到n之后再走向(除了1和2的最小点3),再重复上面的思路:
3->4->3 ->5->3->… ->n,
然后再到4,4->5->4->…->n,

n-1->n,然后只有n到1的边没有走了,再回到1,一条完美的欧拉回路,而且是字典序最小。
所以这个欧拉回路就是
1 2 1 3 1 4 1 5 … 1 n
2 3 2 4 2 5 … 2 n
3 4 3 5 … 3 5

n -1 n
1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=300010;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie();
int t,n,x;
ll l,r;
ll a[N],b[N],c[N];
int get(ll x)
{
	if(x==1ll*(n-1)*n+1) return 1;//特判最后一个1
	int l=lower_bound(a+1,a+n+1,x)-a;
	x-=a[l-1];//x在第l行第几个数
	if(x&1) return l;
	else return l+x/2; 
}
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%lld%lld",&n,&l,&r);
		for(int i=1;i<n;i++)
			a[i]=a[i-1]+1ll*(n-i)*2;//前i行有多少个数
		a[n]=a[n-1]+1;
		for(ll i=l;i<=r;i++)
			cout<<get(i)<<' ';
		cout<<endl;
	}
	return 0;
}

最后差了十分钟,好亏啊。。

posted @ 2020-04-11 08:57  Neflidata  阅读(4)  评论(0编辑  收藏  举报