CSP-J Day5 模拟赛补题报告

目录

一.题目报告

二.赛中情况

三.解题报告

T1.牛奶(milk)

题目情况

题目大意

题目解析

题目正解

T2.树组(traary)

题目情况

题目大意

题目解析

题目正解

T3.智乃的兔子(usagi)

题目情况

题目大意

题目解析

题目正解

T4.一颗成熟的奥术飞弹(missiles)

题目情况 

题目大意

题目解析

题目正解

四.总结


一.题目报告

  赛中第一题AC,第二题5分,第三题20分,第四题0分,赛后全部AC。


二.赛中情况

  第一题贪心AC,第二题模拟了很长时间最后样例对了但5分,第三题背包20分,第四题bfs运行错误0分。


三.解题报告

T1.牛奶(milk)

题目情况

赛中AC。

题目大意

给定牛奶种类n和需要的箱数m,给出每种牛奶的箱数 a[i] 和每箱需要的钱数 b[i],求买到足够的牛奶箱数所需的最少钱数。

题目解析

将箱数和钱数排序,每次都买花费最少的牛奶,直到买到m箱。

题目正解

#include<bits/stdc++.h>
using namespace std;
struct str{
	long long a,b;
}s[100001];
long long n,m,cnt;
bool cmp(str x,str y){
	return x.b<y.b;
}
int main(){
	freopen("milk.in","r",stdin);
	freopen("milk.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
    	scanf("%lld%lld",&s[i].a,&s[i].b);
	}
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++){
		if(m>s[i].a){
    		m-=s[i].a;
    		cnt+=s[i].a*s[i].b;
		}
		else{
			cnt+=m*s[i].b;
			m=0;
			break;
		}
	}
	printf("%lld",cnt);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

T2.树组(traary)

题目情况

赛中5分,赛后AC。

题目大意

n棵树苗,开始高度为零,每天加一,有m次操作,每次操作有三种选择:

op=1:选择某棵树 x 对其施展魔法,该效果持续 k 天(包括当天)。拥有魔法效果的树每天晚上会额外生长 1 单位高度。若施展时该树已经存在魔法效果,则覆盖原来的魔法效果(也就是取消原来的魔法效果,加上这次的魔法效果)。

op=2:选择取消某棵树 x 的魔法效果,可能会对没有施加魔法的树进行操作。

op=3:求该天某棵树 x 的高度。

题目解析

赛中思路:模拟,天数循环。

正解:p:记录第i棵树最近一次施法时间。如果当前要对i施加魔法,那么上一次施法时间就是pi ,当前时间是枚举到的时间 t,方便判断 t和 pi之差是否已经超过k ,超过 k表示上次施法效果已经没有了,不超过可以继续更新施法时间,更新wi 。
m:记录 pi之前i的魔法加成

题目正解

赛中:

#include<bits/stdc++.h>
using namespace std;
long long n,m,k,p,x,b[100001],s[100001],mx[100001];
int main(){
	freopen("traary.in","r",stdin);
	freopen("traary.out","w",stdout);
	scanf("%lld%lld%lld",&n,&m,&k);
	for(int i=0;i<m;i++){
		scanf("%lld%lld",&p,&x);
		if(p==1){
			if(b[x]==1){
				s[x]=s[x]-k+i-mx[x];
				mx[x]=i;
				s[x]+=k;
			}
			else{
				b[x]=1;
				s[x]+=k;
				mx[x]=i;
			}
		}
		else if(p==2){
			s[x]=s[x]-k+i-mx[x];
			b[x]=0;
		}
		else{
			if(b[x]==0){
				cout<<i&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值