codeforces education Round 85

codeforces education Round 85

摘自百度百科:
很多C++的初学者可能会被这个问题困扰,经常出现程序无故超时,最终发现问题处在cin和cout上,(甚至有些老oier也会被这个问题困扰,每次只能打scanf和printf,然后一堆的占位符巨麻烦),这是因为C++中,cin和cout要与stdio同步,中间会有一个缓冲,所以导致cin,cout语句输入输出缓慢,这时就可以用这个语句,取消cin,cout与stdio的同步,说白了就是提速,效率基本与scanf和printf一致。然后就可放心的使用cin,cout了。(不过实际上使用了using namespace std;之后就可以直接打ios::sync_with_stdio(false);了)

A

题意:给你一些统计游戏数据,让你判断,顺序是否合理。
ai表示游戏次数,bi表示清楚次数。
题解:保证下一次的游戏次数大于等于上一次的游戏次数,并且保证游戏次数的增量会大于等于清楚次数的增量。

#include<iostream>
using namespace std;
int main()
{
	int t,n,x,y;
	cin>>t;
	while(t--)
	{
		cin>>n;
		int mx=0,my=0;
		int flag=0;
		while(n--)
		{
			
			cin>>x>>y;
			if(x<mx || y<my || (x-mx)<(y-my))
				flag=1;
			mx=x;my=y;
		}
		if(flag) cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
	return 0;
}

B

题意:有n个人,他们每个人有ai的钱,政府制定了一个中产阶级指标T,如果超过这个数则为中产阶级,政府想要有更多的中产阶级,可以将那些超过中产指标的人的钱分给那些没有达到中产阶级水平的人,使他们达到中产阶级。问最多可以让多少人达到中产阶级水平。

题解:对人的钱sort一下,如果最大值会小于T的话直接输出0。否则对,这些sum求和,然后除以人数,如果会大于T的话更新最大人数。

坑点:注意sum要开ll

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int t,n,x;
const int N = 1e5+7;
int a[N];
bool cmp(int a,int b)
{
	return a>b;
}
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>x;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		sort(a+1,a+n+1,cmp);
		long long sum=0;
		int cnt=0;
		for(int i=1;i<=n;i++)
		{
			sum += a[i];
			if(sum*1.0/i>=x) cnt=i;
		}
		cout<<cnt<<endl;
	}
	return 0;
}

C

题意:杀怪物,怪物们站成一圈。杀一个怪物需要ai枪,并且怪物死后会对下一只怪物造成bi的伤害,问最少需要多少枪才能杀死所有怪物。

题解:将每一个怪物的血量降到前一只怪物能够杀死范围内然后即为最小。计算c[i],即为炸完后还需要补刀次数,如果大于0的话就需要补刀了。然后如果c[i]比0大的话,就将答案sum+c[i],计算完所有后开始判断。
如果c[i]>0 的话,减去该次补刀次数,再加上杀死该怪需要次数。否则如果c[i] <= 0表示不需要补刀,直接杀死该怪物就行了。ans每次取最小。

代码:
坑点:这个题卡了个输入输出,所以输入最好是用scanf或者是取消同步缓冲。

#include<iostream>
#include<cmath>
using namespace std;
#define SIS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ll;
const int maxn=3e5+10;
ll a[maxn],b[maxn],c[maxn];

int main()
{
	SIS;
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>a[i]>>b[i];
		if(n==1)
		{
			cout<<a[1]<<endl;
			continue;
		}
		ll sum=0;
		for(int i=2;i<=n;i++)
		{
			c[i]=a[i]-b[i-1];
			if(c[i]>0)
				sum += c[i];
		}
		c[1]=a[1]-b[n];
		if(c[1]>0) sum += c[1];
		ll ans=1e18;
		for(int i=1;i<=n;i++)
		{
			if(c[i]>0)
				ans=min(ans,sum-c[i]+a[i]);
			else
				ans=min(ans,sum+a[i]);
		}
		cout<<ans<<endl;
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值