集训队每周一赛 2020-04-02(思维/模拟+贪心+二分)

A 金龙小学的口语考试

CodeForces 1185C1

传送门

小P今天要去金龙小学对 n(1 <= n <= 100)位学生进行英语口语测试,这场口语测试是这样进行的:
1 . 每名学生排好队,按编号1,2,3…n依次进行测试(即1结束考试后,2再考试…);
2. 编号为 i 的学生会使用第 i 套口语测试试题,而每套试题都有规定的时间 ti(1 <= ti <= 100)作答;
3. 每名学生抽到试题后有两个反应:①觉得这题目太难了,立马放弃走人了,没有浪费一分一秒,对于这种小P都会打不合格;②老老实实在这套试题规定的时间 ti 完成口语测试,然后小P会给他一个至少合格分数再走人;
学生们都严格按照抽到的次序进行测试,且没有中断测试的情况。
但是现在这次测试的测试时间被压缩为M分钟(max(ti) <= M)
你的任务是计算:对于每一位学生 i ,为了让学生 i 拿到了合格分数,请计算出学生 i 前面最少有多少人要不合格的才能使得学生i合格。

输出描述

输入包含2行。
第一行,给出两个数 n 和 M(含义和范围已在题面给出),第二行给出 n 个数,其中第i个数表示第i个套题规定时间为 ti 分钟。

输入描述

输入保证每个 ti 都小于 M
输出仅一行,n个数,第i个数表示为了使第 i 个人拿到合格分数,前面最少的不及格的人数。

示例:

Input:
7 15
1 2 3 4 5 6 7
Output:
0 0 0 0 0 2 3
Input:
5 100
80 40 40 40 60
Output:
0 1 1 2 3

说明/提示:

样例一,让前5个学生都做完题目所需要的时间都小于或等于M,所以,他们都不需要不及格的人,所以最少的 不及格人数是0。而为了让第6和第7个学生通过测试,前面分别必须让第3,4和第2,5,6个学生不及格。

题解

问 题 转 换 成 对 于 每 一 个 学 生 i, 删 掉 最 少 的 数 使 得
t1+t2+….ti-1 <= M-ti ,也可转换成在 t1,t2,……ti-1中选择尽
量多的数使得和小于等于 M-ti 。
注意本题一重要条件 1 <= ti <= 100, 范围足够小可以统计每个 i 前面出现了那些数字,然后尽量先取小的数字。

#include<cstdio>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
   
	return a>b;
}
int main()
{
   
	int i,j,cnt=0,n,m,tmp;
	scanf("%d%d",&n,&m);
	int a[1000],b[1000],sum[1000];
	sum[0]=0;
	for(i=1; i<=n; i++)
	{
   
		scanf("%d",&a[i]);
		b[i]=a[i];
		sum[i]=sum[i-1]+a[i];
	}
	printf("%d ",cnt);		
	for(i=2; i<=n; i++)
	{
   
		cnt=0;
		sort(b+1,b+i,cmp);	
		for(j=1; j<=i; j++)
		{
   		
			if(sum[i]>m)
			{
   
				sum[i]-=b[j];
				cnt++;
			}
		}
		printf("%d ",cnt);
	}
	return 0;
}

B 黄牌警告

传送门

CodeForces 1215A

巴德利星球最近举行了足球杯总决赛。整场比赛中,裁判出示了n张黄牌。
比赛一开始,在第一队中有a1个球员,而在第二队中有a2个。
在巴德利星球, 把人罚下场的规则与正常规则是不同的。
来自第一队的一个球员收到k1 张黄牌,他被罚下场并不能继续参加比赛了;
来自第二队的球员则需要 k2 张才会下场。下场的球员不能再收到黄牌。即使某一队(甚至两队)的球员全部被罚下场,比赛仍能继续。
裁判忘记了自己把每张黄牌罚给了谁,所以请你帮助裁判确定可能的被罚下场的人数的最小值和最大值。

输入描述:

共有5行,每行一个整数a1,a2,k1,k2,n。含义如上文所述。
保证:1 ≤ a1,a2,k1,k2 ≤ 1000,1 ≤ n ≤ a1∗k1+a2∗k2;

输出描述:

一行两个整数,表示可能的被罚下场的球员数的最小值和最大值。

示例:

Input:
2
3
5
1
8
Output:
0 4
Input:
3
1
6
7
2
5
Output:
4 4
Input:
6
4
9
10
89
Output:
5 9

题解

贪心思想;

如何考虑最少人数,让每个人都背上最多但不会被罚下的黄牌,例如 k1 = 5,k2 = 6 时,让一队所有人都背上 4 张黄牌,二队每个人都背上 5 张,如果黄牌已经分完,最少人数为 0,否则剩下几张黄牌就最少罚下几个人;

如何考虑最多人数,先把 k 较小的那一队的人罚下,还有黄牌剩
下,再去罚 k 较大的一方。

#include<stdio.h>
#define ll long long
int main()
{
   
	ll a,b,k1,k2,n;
	ll min,max,ans1=0,ans2=0;
	scanf("%lld%lld%lld%lld%lld",&a,&b,&k1,&k2,&n);
	min=n,max=n;
	min=min-(a*(k1-1)+b*(k2-1));
	if(min>0)
		ans1=min;
	else ans1=0;
	if(k1<k2)
	{
   
		if(max>(a*k1))
		{
   
			ans2+=a;
			max -= a*k1;
		}
		else
		{
   
			ans2+=max/k1;
			max-=max/k1 * k1;
		}
		if(max/k2)   ans2+=max/k2;
	}
	else
	{
   
		if(max>(b*k2))
		{
   
			ans2+=b;
			max 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值