Codeforces Round #727 (Div. 2)

Codeforces Round #727 (Div. 2)

(所有数据都要开long long)

A. Contest Start

分类讨论,一种是n大于所包含人数的区间长度,另一种是小于等于.
#include<cstdio>
using namespace std;
int main()
{
	int k;
	scanf("%d",&k);
	while(k--)
	{
		long long int n,x,t;
		scanf("%lld%lld%lld",&n,&x,&t);
		long long int dis=t/x;
		long long int ans1=0;
		long long int ans2=0;
		if(n>dis)
		{
			ans1=dis*(n-dis);
			ans2=(dis-1)*dis/2;
		}
		else ans1=(n-1)*n/2;
		printf("%lld\n",ans1+ans2);
	}
	return 0;
}

B. Love Song

把字母转换成数字,算一个前缀和,答案就是pre[r]-pre[l-1].
#include<cstdio>
#include<iostream>
using namespace std;

const int maxn=1e5+10;
char s[maxn];
long long int pre[maxn];

int main()
{
	int n,q;
	scanf("%d%d",&n,&q);
	cin >> s+1;
	for(int i=1;i<=n;i++)
	{
		pre[i]=(s[i]-'a'+1)+pre[i-1];
//		printf("%lld ",pre[i]);
	}
	while(q--)
	{
		int l,r;
		scanf("%d%d",&l,&r);
		printf("%lld\n",pre[r]-pre[l-1]);
	}
	return 0;
}

C. Stable Groups

贪心:进行两遍排序,第一遍从小到大排序,算出不加数字的区间的个数;统计每个区间之间所需要添加数字的个数,之后由小到大排序。
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=2e5+10;
long long int f[maxn];
long long int w[maxn];

bool comp(long long int a,long long int b)
{
	return a<b;
}

int main()
{
	long long int n,k,x;
	scanf("%lld%lld%lld",&n,&k,&x);
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&f[i]);
	}
	sort(f+1,f+n+1,comp);
	long long int pos=1;
	int cnt=1,g=0;
	for(int i=1;i<n;i++)
	{
		if(f[i+1]-f[i]>x)
		{
			w[++g]=(f[i+1]-f[i])/x;
			if(w[g]*x<f[i+1]-f[i]) w[g]++;
			w[g]--;
			cnt++;
//			printf("%lld ",w[g]);
		}
	}
//	printf("%d\n",cnt);
	sort(w+1,w+g+1,comp);
	for(int i=1;i<=g;i++)
	{
		if(k<w[i]) break;
		else
		{
			k-=w[i];
			cnt--;
		}
	}
	printf("%d",cnt);
	return 0;
}

D. PriceFixed

双指针进行模拟:对每个物品的bi从小到大排序,用cnt记录已经买了物品的个数,如果现在cnt已经大于等于首位物品的bi已经那就从左边开始购买,否则从右边.
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn=1e6+10;
struct things
{
	long long int a;
	long long int b;
}v[maxn];

bool comp(things x,things y)
{
	if(x.b==y.b) return x.a<y.a;
	return x.b<y.b;
}

int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&v[i].a,&v[i].b);
	}
	sort(v+1,v+n+1,comp);
	long long int cnt=0;
	long long int ans=0;
	int l=1,r=n;
	while(l<=r)
	{
		if(cnt>=v[l].b)
		{
			cnt+=v[l].a;
			ans+=v[l].a;
			v[l].a=0;
			l++;
			continue;
		}
		if(cnt+v[r].a==v[l].b)
		{
			ans+=2*v[r].a;
			cnt+=v[r].a;
			r--;
			continue;
		}
		if(cnt+v[r].a>v[l].b)
		{
			long long int d=v[l].b-cnt;
			ans+=2*d;
			cnt+=d;
			v[r].a-=d;
			continue;
		}
		if(cnt+v[r].a<v[l].b)
		{
			ans+=2*v[r].a;
			cnt+=v[r].a;
			r--;
			continue;
		}
	}
	printf("%lld",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值