可达鸭 CSP-X复赛模拟1补题报告

1.比赛分数:

共4题,满分400,比赛中得0分,4题0分。

因为头上的freopen(".in","r",stdin);
                  freopen(".out","w",stdout);

没有写名字,所以都0分。

2.比赛过程:

第1题开始想用满60近1的方法,可是没有想到会超过24小时。

第2题开始想用直接用最大的减最小的。

第3题开始想用价格直接加到累加器上。

第4题开始我把重复的组合。

3题解报告:

(1)

情况:赛中0分,已补题。

题意:输入开始时间和结束时间还有过程时间。

题解:将开始时间和结束时间还有过程时间都算成秒。

错思路:满60近1。

错代码:

#include <cstdio>
#include <iostream>
using namespace std;
struct now{
    int h1,m1,s1;
}a;
struct k{
    int h2,m2,s2;
}b;
int main(){
    int p,q;
    int x,y;
    cin>>a.h1>>a.m1>>a.s1>>b.h2>>b.m2>>b.s2;
    cin>>p>>q;
    int t=p+q;
    while(t>=60){
        x++;
        t=t-60;
    }
    while(t>=60){
        y++;
        t=t-60;
    }
    a.h1=a.h1+y;
    a.m1=a.m1+x;
    a.s1=a.s1+t;
    if(a.m1>=60){
        a.h1++;
        a.m1-=60;
    }else if(a.s1>=60){
        a.m1++;
        a.s1-=60;
    }
    if(a.h1<=b.h2){
        if(a.m1<=b.m2){
            if(a.s1<=b.s2){
                cout<<"Yes";
                return 0;
            }
        }
    }
    cout<<"No";        
    return 0;

对思路:

将开始时间和结束时间还有过程时间都算成秒,然后计算。

对代码:

#include <cstdio>
#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 sum1=s1+m1*60+h1*3600+p+q;
    long long sum2=s2+m2*60+h2*3600;
    if(sum1<sum2){
        cout<<"Yes";
    }else{
        cout<<"No";
    }
    return 0;
}

(2)

情况:赛中0分,已补题。

题意:从s数组里的一个数+或-k,让最大值减最小值。

题解:让第1个数组的最大的减k,让第2个数组的最小的加k。

错思路:直接最大值减最小值。

错代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,k,s[1000],a[1000];
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>s[i];
    }
    sort(s+1,s+1+n);
    s[n]=s[n]-k;
    s[1]=s[1]+k;
    cout<<s[n]-s[1]; 
    return 0;

对思路:

让第1个数组的最大的减k,让第2个数组的最小的加k,再算出两个数组最大和最小的差。

对代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,k,s[100005],a[100005],b[100005],s1=0,s2=0;
    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+1+n);
    sort(b+1,b+1+n);
    a[1]+=k;
    b[n]-=k;
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    s1=a[n]-a[1];
    s2=b[n]-b[1];
    cout<<min(s1,s2);
    return 0;
}

(3)

情况:赛中0分,已补题。

题意:输入n个物品价格和k个折扣券。

题解:利用双指针。

错思路:当时没思路。

错代码:

#include <cstdio>
#include <iostream>
using namespace std;
int main(){
    int n,k,t,b[4000]={0};
    cin>>n>>k;
    int max=0,min=114514,sum=0;
    for(int i=1;i<=n;i++){
        cin>>t;
        //clllout<<a[i];
        bool j=0;
        while(k!=0){
            for(int i=1;i<=n;i++){
                if(t>max){
                    max=t;
                    j=1;
                }else if(t<min){
                    min=t;
                    j=1;
                    //cout<<a[i]<<" ";
                }
                if(j==0){
                    b[i]=t;
                }
            }
            sum=sum+min*2;
            n=n-2;
            //cout<<min<<" ";
            k--;
        }
    }
    for(int i=1;i<=n;i++){
        sum=sum+b[i];
    }
    cout<<sum; 
    return 0;

对思路:

双指针。

对代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long n,k,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,s=0;
    while(k--&&l<=r){
        s+=a[l];
        l++;
        r--;
    }
    while(l<=r){
        s+=a[r];
        r-=2;
    }
    cout<<s;
    return 0;
}

(4)

情况:赛中0分,已补题。

题意:多组测试,第一行一个整数 t,表示测试组数。然后对于每组测试数据,输入一个字符串s

题解:循环输入s,并求长度和用不去重桶标记记录出现次数最多的字符(?除外),如有问号加到最多的里面,然后用等差数列公式,最后输出。

错思路:不会。

错代码:

#include <cstdio>
#include <iostream>
using namespace std;
int main(){
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
    int n;
    cin>>n;
    string s;
    int cnt=0;
    while(n!=0){
        cin>>s;
        int len=s.size();
        for(int i=0;i<=len-2;i++){
            for(int j=i+1;j<=len-1;j++){
                if(s[j]=='?'&&s[i]>=65&&s[i]<=122){
                    cnt++;
                    break;
                }
                if(s[i]=='?'&&s[j]>=65&&s[j]<=122){
                    cnt++;
                    break;
                }
                if(s[i]==s[j]){
                    cnt++;
                    break;
                }
            }
        }
        cout<<cnt<<endl;
        n--;
    }
    fclose(stdin);
    fclose(stdout);
    return 0;

对思路:

循环输入s,并求长度和用不去重桶标记记录出现次数最多的字符(?除外),如有问号加到最多的里面,然后用等差数列公式。

对代码:

#include<bits/stdc++.h>
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值