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

1.比赛分数:

共4题,满分400,比赛中得50分,第1题0分,2题30分,第3题10分,第4题10分。

2.比赛过程:

第1题看到时以为是减出来的绝对值加到累加器上,可是老师说要用比较出来最大的时间。

第2题一看到就想到打暴力,可是没想到会是时间超限。

第3题是一开始想双指针枚举,可是不会。

第4题本想用桶标记,但多样数据不会。

3.题解报告:

(1)

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

题意:

一个整数 n ,表示人数一个整数 L ,表示独木桥的长度,第三行是a1,a2​​ …an​​ ,其中a​i​​ 表示第 i 个人初始位置到独木桥左端点 的距离,表示所有人都离开独木桥所需的最短时间。

题解:比出最大的。

错思路:无。

错代码:

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

对思路:

比出时间最长的。

对代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long n,l,x,s=0;
    cin>>n>>l;
    for(int i=1;i<=n;i++){
        cin>>x;
        s=max(s,min(x,l-x));
    }
    cout<<s;
    return 0;

(2)

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

题意:一个整数,表示把棋子从 x 号格子移动到y 号格子需要的最少操作次数。

题解:判断情况。

错思路:判断少了。

错代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long x,y,s=0;
    cin>>x>>y;
    while(x!=y){
        if(x<y&&x>0&&y>0){
            cout<<s+y-x;
            return 0;
        }
        if(x>y&&x>0&&y>0){
            x=x-x*2;
            s++;
        }
        if(x<y&&x<=0&&y>0){
            x=x+x*-2;
            s++;
        }
    }
    cout<<s;
    return 0;

对思路:全部情况遍历

对代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long x,y,ans;
    cin>>x>>y;
    if(x*y<0){
        ans=abs(abs(x)-abs(y))+1;
    }else if(x*y>0){
        if(x>y){
            ans=x-y+2;
        }else if(x<y){
            ans=y-x;
        }
    }else{
        ans=abs(x-y);
        if(x>y){
            ans=ans+1;
        }
    }
    cout<<ans;
    return 0;

(3)

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

题意:最少需要花费多少钱买门票才能看到所有种类的动物(同
一种动物他可能不止看一个)。

题解:双指针从一个头上查找看的最多的种类。

错思路:暴力骗分。

错代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long n,m,x[100000],cnt=0,s=0;
    cin>>n,m;
    for(int i=1;i<=n;i++){
        cin>>x[i];
    }
    int a=1,b=n;
    cout<<m*10;
    return 0;

对思路:利用双指针从一个头上查找看的最多的种类。

对代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
    long long n,m,a[1000000],b[1000000];
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    int l=1,r=0,cnt=0,ans=0x3f3f3f3f;
    while(r<n){
        while(cnt<m&&r<n){
            r++;
            b[a[r]]++;
            if(b[a[r]]==1){
                cnt++;
            }
        }
        while(cnt==m){
            ans=min(ans,r-l+1);
            b[a[l]]--;        
            if(b[a[l]]==0){
                cnt--;
            }
            l++;
        }
    }
    cout<<ans*10;
    return 0;

(4)

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

题意:计算最小的代价。

题解:计算出两种方法然后比较最小的代价。

错思路:只计算一种方法。

错代码:

#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
    return a<b;
}
int main(){
    long long t;
    cin>>t;
    for(int i=1;i<=t;i++){
        long long n,c,x[100000],b[100000]={0},max=0,s=0;
        cin>>n>>c;
        if(c<=1){
            cout<<n*c;
        }else{
            for(int i=1;i<=n;i++){
                cin>>x[i];
            }
            sort(x+1,x+1+n,cmp);
            for(int i=1;i<=n;i++){
                b[x[i]]++;
            }
            for(int i=1;i<=n;i++){
                if(b[i]>max){
                    max=b[i];
                }
            }
            s=s+max*c;
            for(int i=1;i<=n;i++){
                
            }
            cout<<s; 
        }
    }
    return 0;

对思路:标记出现的卫星,然后选择方法计算

对代码:

#include <bits/stdc++.h>
using namespace std;
const int N=5e6+5;
int cnt[N];
int main(){
    int t,n,c;
    cin>>t;
    while(t--){
        int x,ans=0;
        memset(cnt,0,sizeof cnt);
        cin>>n>>c;
        for(int i=1;i<=n;i++){
            cin>>x;
            cnt[x]++;
        }
        for(int i=1;i<=N;i++){
            ans=ans+min(c,cnt[i]);
        }
        cout<<ans<<endl;
    }
    return 0;

4.反思

通过老师讲解后我深深的体会到了复赛的困难,所以我会尽我所能的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值