目录
一.题目报告
赛中第一题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&