CSP-X模拟赛一刘皓铭补题报告 日期:2024.10.2 学号:S09637

一、总分数

T1[做饭(cook)]:91
T2[评价标准(criterion)]:80
T3[小可买菜(buy)]:50
T4[美味佳肴(cuisine)]:0

总分:221分

二、比赛过程

第一题并不难,但我多了一个特殊判断=号,所以少了9分;

第二题有一些难度要同时考虑到最大、次大、最小、次小,我无法实现,就舍弃了一部分,故80分;

第三题看上去是一个队列题,很难,但仔细一想会发现并不是。

第四题我没有思路;

三、比赛分析

T1[做饭(cook)]

1.题目大意

给出现在时刻和未来时刻,看之间有没有q+p秒;

2.我的思考

我先用自己的方法,得出了一个错误答案,后经仔细读题,发现方法和步骤。

3.题目解析

先把两个时刻化为以秒为单位的变量做差再和p+q作比较,输出正否,尤其注意条件是大于。

4.AC代码

#include<bits/stdc++.h>
using namespace std;
long long now1,now2,now3,k1,k2,k3,p,q,times1,times2,times3;
char c;
int main(){
    freopen("cook.in","r",stdin);
    freopen("cook.out","w",stdout);
    cin>>now1>>c>>now2>>c>>now3;
    cin>>k1>>c>>k2>>c>>k3;
    cin>>p>>q;
    times1+=k1*3600+k2*60+k3;
    times2+=now1*3600+now2*60+now3;
    times3=times1-times2-p-q;
    if(times3>0) cout<<"Yes";
    else cout<<"No";
    fclose(stdin);
    fclose(stdout);
    return 0;
}

T2[评价标准(criterion)]

1.题目大意

给定一个操作值 k,然后任意从数组中选择一个数字x,可以将数字 x 加上 k,或者减去 k,之后得到一个新的数组,并使得新数组的评价标准最小。最终输出最小的评价标准。

2.我的思考

比较(最大值-k)-最小值  和  最大值-(最小值+k),输出最小值。

3.题目解析

定义最大、次大、最小、次小,改变最大时,将其放入次大中,最小值同理,最后相减,要注意k应该是绝对值。

4.AC代码

#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f3f;
long long n,k,a[1000005],min1,min2,max1,max2,a1,a2,n1,n2,nmax,nmin,ans=inf;
int main(){
    freopen("criterion.in","r",stdin);
    freopen("criterion.out","w",stdout);
    cin>>n>>k;
    k=abs(k);
    max1=-inf,max2=-inf;
    min1=inf,min2=inf;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]>max2){
            if(a[i]>max1){
                a2=a1,max2=max1;
                a1=i,max1=a[i];
            }
            else a2=i,max2=a[i];
        }
        if(a[i]<min2){
            if(a[i]<min1){
                n2=n1,min2=min1;
                n1=i,min1=a[i];
            }
            else n2=i,min2=a[i];
        }
    }
    a[n1]+=k;
    nmin=min(min2,a[n1]);
    nmax=max(max1,a[n1]);
    ans=min(ans,nmax-nmin);
    a[a1]-=k;
    nmax=max(max2,a[a1]);
    nmin=min(min1,a[a1]);
    ans=min(ans,nmax-nmin);
    cout<<ans;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

T3[小可买菜(buy)]:50

1.题目大意

总共有n个食材需要购买,在超市中第i个食材的价格是vi,另外,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。
还有k 张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
注意:商品不能重复参加活动。

2.我的思考

先使用优惠券,再搞促销,但算重复了;

3.题目解析

先循环k次,最小与最大值结合,累加最小值并删除最小值与最大值。循环k次后,循环用双指针再累加。

4.AC代码

#include<bits/stdc++.h>
using namespace std;
long long n,k,a[1000005],ans;
int main(){
    freopen("buy.in","r",stdin);
    freopen("buy.out","w",stdout);
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    int L=1,R=n;
    for(int i=1;i<=k;i++){
        ans+=a[L];
        L++,R--;
    }
    while(L<=R){
        ans+=a[R];
        R-=2;
    }
    cout<<ans<<endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

T4[美味佳肴(cuisine)]

1.题目大意

字母只能与相同字母搭配,?能和所有搭配,但只能用一次,问有多少种搭配。

2.我的思考

固定一个字符,与后面其他字符配对。

3.题目解析

统计所有字符出现次数,“?”与出现次数最多的字符配对,最后再累加。

4.AC代码

#include<bits/stdc++.h>
using namespace std;
long long t;
string s;
int main(){
    freopen("criterion.in","r",stdin);
    freopen("criterion.out","w",stdout);
    cin>>t;
    while(t--){
        cin>>s;
        long long l=s.size(),ans=0,a[300]={0},maxx=0,id=0;
        for(int i=0;i<l;i++) a[s[i]]++;
        for(int i=0;i<300;i++){
            if(char(i)!='?'&&a[i]>maxx){
                maxx=a[i];
                id=i;
            }    
        }
        a[id]+=a['?'];
        a['?']=0;
        for(int i=0;i<300;i++){
            if(a[i]!=0) ans+=a[i]*(a[i]-1)/2;
        }
        printf("%lld\n",ans);
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值