可达鸭模拟赛(一)补题报告(S10891栾珺琦)

一.比赛分数

共四题,总分400分,第一,二,三,四题都是0分,总分0分。

二.比赛过程

第一题我一直在求秒数,然后和做饭时间比,有的自己知道写的不全,但不想写,也不会写,浪费时间太长。

第二题题没看懂,看样例也没看懂,蹭的样例。

第三题没算明白是怎么算出来的,也没想到用双指针,蹭的样例。

第四题我用的是双指针,按题目提示算的,也靠之前学过的代码,但只记得一点。

四.题解报告

(1).第一题:做饭

情况:赛中0分,已补题

题意:如果可以赶在达达回家之前制作完晚饭,输出Yes,否则输出No

题解:k1知识,只有scanf不是 ,定义sum求出秒数,然后比较,可以输出Yes,不行输出No。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
long long n,a,b;
long long c,k,j;
long long p,q;
int main(){
    scanf("%lld:%lld:%lld",&n,&a,&b);
    scanf("%lld:%lld:%lld",&c,&k,&j);
    scanf("%lld%lld",&p,&q);
    long long sum=(n*3600+a*3600+b)-(c*3600+k*3600+j);
    if (sum>p+q){
        cout<<"Yes";
    }
    else {
        cout<<"No";
    }
    return 0;
}

(2).第二题:评价标准

情况:赛中0分,已补题

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

题解:六个if,把最小的数加上kk,判断加上kk后是最小的,次小的,还是最大的,再把最大的减去kk,判断减去kk后是最大的,次大的,还是最小的,最后输出一行,包含一个整数,表示操作后最小的评价标准。

AC代码:

暴力方式:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e6+10,M=0x3f3f3f3f;
int maxx=M,cmax=M,minn=M,cmin=M;
int n,k,s[N];
int ans=0;
int main(){
    cin>>n>>k;
    k=abs(k);
    for (int i=1;i<=n;i++){
        cin>>s[i];
        maxx=max(maxx,s[i]);
        minn=min(minn,s[i]);
    }
    ans=maxx-minn;
    int c1=0,c2=0;
    for (int i=1;i<=n;i++){
        if (s[i]==minn) c1++;
        if (s[i]==maxx) c2++;
        if (s[i]!=minn&&s[i]<cmin) cmin=s[i];
        if (s[i]!=maxx&&s[i]>cmax) cmax=s[i];
    }
    if (c1>1&&c2>1){
        cout<<ans;
        return 0;
    }
    if (c1==1&&c2>1){
        int t=k+minn;
        if (t>=cmin&&t<maxx){
            ans=min(ans,maxx-cmin);
        }else if (t<cmin){
            minn=k+minn;
            ans=min(ans,maxx-minn);
        }else if (t>=maxx){
            maxx=t;
            ans=min(ans,maxx-cmin);
        }
    }else if (c2==1&&c1>1){
        int t=maxx-k;
        if (t<=cmax&&t>minn){
            ans=min(ans,cmax-minn);
        }else if(t>cmax){
            maxx=t;
            ans=min(ans,maxx-minn);
        }else if (t<=minn){
            minn=t;
            ans=min(ans,cmax-minn);
        }
    }else {
        if (k+minn<cmin){
            minn=k+minn;
            ans=min(ans,maxx-minn);
        }
        if (k+minn>=cmin&&k+minn<maxx){
            ans=min(ans,maxx-cmin);
        }
        if (k+minn>=maxx){
            maxx=k+minn;
            ans=min(ans,maxx-cmin);
        }
        if (maxx-k>cmax){
            maxx=maxx-k;
            ans=min(ans,maxx-minn);
        }
        if (maxx-k<=cmax&&maxx-k>minn){
            ans=min(ans,cmax-minn);
        }
        if (maxx-k<=minn){
            minn=maxx-k;
            ans=min(ans,cmax-minn);
        }
    }
    cout<<ans;
    return 0;
}

简便方式:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
int n,k,s[10000005],a[10000005],b[10000005],sum1=0,sum2=0;
int main(){
    cin>>n>>k;
    k=abs(k);
    for (int i=1;i<=n;i++){
        cin>>s[i];
        a[i]=s[i];
        b[i]=s[i];
    }
    sort (a+1,a+n+1);
    sort (b+1,b+n+1);
    a[1]+=k;
    b[n]-=k;
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    sum1=a[n]-a[1];
    sum2=b[n]-b[1];
    if (sum1<sum2) cout<<sum1;
    else cout<<sum2; 
    return 0;
}

(3).第三题:小可买菜

情况:赛中0分,已补题

题意:每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。

题解:双指针思想,l指向数组头,r指向数组尾,使用一张折扣券,存最低数额,然后r++,l--,有几张进行几次,如果没有折扣券了,r移动两次,再加上r所在位的数额,数组如果是奇数,移动完后l==r,就加上l和r所在位的数额,最后输出最低花费多少元。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e6+10;
long long n,k;
long long a[N];
int main(){
    cin>>n>>k;
    for (int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    long long L=1,R=n,sum=0;
    while (k--&&L<=R){
        sum+=a[L];
        L++;
        R--;
    }
    while (L<=R){
        sum+=a[R];
        R-=2;
    }
    sum>>sum;
    return 0;
}

(4).第四题:美味佳肴

情况:赛中0分,已补题

题意:大写字母 和 ?,相同大写字母表示两个食物搭配起来吃最美味,?则表示搭配任何一个食物吃都非常美味,但是达达有习惯,一旦使用当前这种食物搭配另一个食物,达达就不会再去搭配其他食物吃,也就是说每个?确定与某个食物搭配后,则不能再与其他食物搭配食用。

题解:在字符串中存在 l,rl,r 满足 l < rl<r 且 s[l] == s[r]s[l]==s[r],则表示一种美味搭配。找出最多的不同的搭配,当 ll 不同或 rr 不同,就表示一种不同搭配。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
int t;
long long a[95];
string s;
int main(){
    cin>>t;
    while (t--){
        memset(a,0,sizeof a);
        cin>>s;
        int maxx=0;
        long long ans=0;
        int len=s.size();
        int temp;
        for (int i=0;i<len;i++){
            a[s[i]]++;
            if (s[i]!='?'){
                if (a[s[i]]>maxx){
                    maxx=a[s[i]];
                    temp=s[i];
                }
            }
        }
        if (a['?']==0){
            for (int j=65;j<=90;j++){
                ans+=a[j]*(a[j]-1)/2;
            }
        }
        else {
            a[temp]+=a['?'];
            for (int j=65;j<=90;j++){
                ans+=a[j]*(a[j]-1)/2;
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

四.赛事总结

本次比赛中,除了第一题还有点思路,其他都几乎没有,在写完第一题时,可能就觉得后面难了,后面就没第一题认真了,并且我在保存文件上也用了很长时间,以后需要多思考,多积累。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值