CSP-X 高分班(2班)模拟赛一补题报告

                                             S09689陈丽颖


1.题目报告


比赛中第1题AC,2.3.4题0分。第2题因为我当时只是用最大值减最
小值再减k,以为自己能骗到一点分,结果得了0分。第3题比赛时0分,
当时只对了一个样例,觉得应该能得分,结果交上后一分没得。第    4题比赛时0分。当时一看到题目,不会做(啊?这题超纲了吧?),天塌了(T口T T    口T)。
2.解题报告
T1.做饭(cook)
题目情况:
比赛时AC,当时我是把小可做饭的时间(秒)转换为了小时:分钟:秒,然后再用达达到家的时间减当前的时间和他去比较,但是就是这个方法,让我本来20行的代码,写到了60多行。
题目大意:
小可要给达达做饭,给你当前的时间和达达到家的时间以及小可做饭的准备时间
和制作时间(秒),让你求小可是否能在达达回来之前做好饭。小可对达达真的是真爱!小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!
已知达达到家时间是 k时刻,并且知道当前处在now时刻。
小可需要 p秒时间去准备好饭菜。
假设小可制作晚饭总共需要q秒时间。
请问赶在达达到家之前,小可是否能准备完晚饭。


题目解析:
1.输入第一行是要按照时:分:秒来输入,中间的冒号有用scanf或者定义char类型变量。
2.如果要判断在达达回来之前,小可是否能做完饭,就要把做饭的时间转换为小时或者把达达回家的时间转换为秒数,来比较一下。
3.输出时注意Yes的Y要大写,No的N要大些。
正确代码:
#include<iostream>
using namespace std;
int main(){
    long long h1,m1,s1,h2,m2,s2,p,q;
    scanf("%lld:%lld:%lld",&h1,&m1,&s1);
    scanf("%lld:%lld:%lld",&h2,&m2,&s2);
    cin>>p>>q;
    long long t=(h2*3600+m2*60+s2)-(h1*3600+m1*60+s1);
    if(t>p+q){
        cout<<"Yes";
    }
    else{
        cout<<"No";
    }
    return 0;
}

T2.评价标准(criterion)
题目情况:
因为我当时只是用最大值减最小值再减k,以为自己能骗到一点分,结果得了0分T口T。
题目大意:
小可同学觉得问题过于简单。然后定义了一种操作:给定一个操作值k,然后任意从数组中选择一个数字x,可以将数字 x 加上 k,或者减去 k,之后得到一个新的数组,并使得新数组的评价标准最小。最终输出最小的评价标准。每次去找最大值,然后让最大值减k,如果最大值减k之后不是最大值了,那么次大值就变成最大值。每次去找最小值,然后让最小值加k,如果最小值加k之后不是最小值了,那么次小值就变成最小值,最后输出最大值-最小值。
题目解析:
1.如果最大值减k了之后,不再是最大值,那么次大值就变成了最大值。
2.如果最小值加k了之后,不再是最小值,那么次小值就变成了最小值。
正确代码:

        
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e6+10;
int s[N];
int ans=inf;
int main(){
    int n,k;
    cin>>n>>k;
    k=abs(k);
    int max1=-inf,max2=-inf,a1,a2;
    int min1=inf,min2=inf,n1,n2;
    int nmax,nmin;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        if(s[i]>max2){
            if(s[i]>max1){
                a2=a1,max2=max1;
                a1=i,max1=s[i];
            }
            else{
                a2=i,max2=s[i];
            }
        }
        if(s[i]<min2){
            if(s[i]<min1){
                n2=n1,min2=min1;
                n1=i,min1=s[i];
            }
            else{
                n2=i,min2=s[i];
            }
        }
    }
    s[n1]+=k;
    nmax=max(max2,s[a1]);
    nmin=min(min1,s[a1]);
    ans=min(ans,nmax-nmin);
    
    s[a1]-=k;
    nmax=max(max2,s[a1]);
    nmin=min(min1,s[a1]);
    ans=min(ans,nmax-nmin);
    cout<<ans;
    return 0;
}
T3.小可买菜(buy)
题目情况:
比赛时0分,当时只对了一个样例,觉得应该能得分,结果交上后一分没得。
题目大意:
小可对达达真的是真爱!小可为了体现对达达的爱,特意要为即将下班的达达做一顿丰富的晚饭!做饭之前需要先购买足够的新鲜的食材,小可来到了超市。小可列了一个购买清单,总共有n个食材要购买,在超市中第i的的食材的价格是ui,请问小可购买清单中所有物品都购买后,最低花费多少元。而且超市正在进行促销,
每满两个食材,都可以用这两个食材中最高价格购买这两个食材。为了节省金钱,小可    还在线购买了k张折扣卷,每两件商品可以使用一张折扣卷,使用两个商品中最低的价    格来购买这两个商品。
题目解析:
1.超市促销时应该时买最大价格和次大价格,这样就可以花最大价格买到最大价格和次大价格的商品了。
2.使用折扣卷时,应该买最小价格的商品和最大价格的商品,这样就可以花最小价格买到最小价格和最大价格的商品了。
3.注意:商品不能重复参加活动。
正确代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,k,v[100005],ans=0;;
    cin>>n>>k;
    int l=1,r=n;;
    for(int i=1;i<=n;i++){
        cin>>v[i];
    }
    sort(v+1,v+1+n);
    while(l<=r){
        if(k>0){
            k--;
            ans+=v[l];
            ++l,--r;
        }
        else{
            ans+=v[r];
            --r,--r;
        }
    }
    cout<<ans;
    return 0;
}
T4.美味佳肴(cuisine)
题目情况:
比赛时0分。当时一看到题目,不会做(啊?这题超纲了吧?),天塌了
(T口T T口T)。所以我根本没做,把时间留给了前面的题。
题目大意:
吃面包要配果酱 吃薯条要配番茄酱·······
达达发现,小可准备的这些美食中,很多食物搭配起来吃最美味了!小可为了让达达吃    起来最顺利,已经给食物提前进行了标记,标记分为两种:大写字母 和 ?,相同大写    字母表示两个食物搭配起来吃最美味,?则表示搭配任何一个食物吃都非常美味,但是    达达有习惯,一旦使用当前这种食物搭配另一个食物,达达就不会再去搭配其他食物吃,    也就是说每个?确定与某个食物搭配后,则不能再与其他食物搭配食用。现在请问小可    制作的饭菜中最多有多少种不同的搭配。不同的搭配表示,字符相等,但是位置不同。    形式化的讲,给定一个由大写字母和?构成的字符串 s,在字符串中存在l,r满足 l< r    且 s[l]==s[r],则表示一种美味搭配。找出最多的不同的搭配,当 l不同或 r 不同,就    表示一种不同搭配。
题目解析:
1.在字符串中存在l,r满足l<r且s[l]==s[r],则表示一种美味搭配.
2.找出最多的不同的搭配,当l不同或r不同,就表示一种不同搭配。
3.现在请问小可制作的饭菜中最多有多少种不同的搭配。
这题可以运用等差数列,有相同的计数器加加,具体代码如下:ans+=a[i]*(a[i]-1)/2;
正确代码:
#include<iostream>
#include<cstring>
using namespace std;
int t,maxx,id;
long long a[300],ans;
string s;
int main(){
    cin>>t;
    while(t--){
        memset(a,0,sizeof a);
        maxx=0,id=0,ans=0;
        cin>>s;
        for(int i=0;i<s.size();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;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值