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

                                                一、题目报告

        第一题30分,第二、三题10分,第四题0分。

·                                               二、解题报告

T1.赚钱(money)

题目情况:

        30分(时间超限)

题目大意:

        

问题描述

​ 小A很喜欢旅游,他的国家共有 n 个城市,编号依次为 11 到 n , 这个暑假小A打算从 11 号城市开始按编号从小到大依次旅游完所有的城市,最后达到 n 号城市,而且他不走回头路, 每个城市只走一次。

小A很聪明,在没出发之前,他已经了解到,每个城市都有他喜欢的小熊纪念品,但是每个城市的价格却不完全一样(在同一个城市买入和卖出一个小熊纪念品的价格相同),于是小A打算从经过的某一个城市 x 买一个纪念品,然后在后面经过的某个城市 y 卖掉,从而赚取其中的差价。但是他必须在某个城市买 11 次,而且只能买 11 个,并且一定要在后面的某个城市卖掉(不能在同一个城市先买入后再卖出),因为他家里已经有很多小熊纪念品了。

​ 如,22 号城市的纪念品价格是 10 元,6 号城市的纪念品是 8 元,10 号城市的纪念品是 18元,假设小A在 2 号城市花 10 元钱买了一个纪念品,如果在6 号城市卖掉他就亏了 2 元(赚 −2 元),如果在 10 号城市卖,他就会赚 8 元。

​ 小A希望赚的钱越多越好。

​ 问:小A最多能赚多少钱(当然也有可能亏钱)?

输入格式

第一行一个整数 n ,表示城市的个数。

第二行, n 个用一个空格隔开的正整数, 1,2,..a​1​​,a​2​​,..a​n​​,依次表示小A 要经过的城市的纪念品的价格。

输出格式

输出一个整数, 表示小A能赚到钱的最大值。

题目解析:

        1.如果嵌套for循环会时间超限,需要记忆化一下

正确代码:

#include<iostream>
using namespace std;
const int N=2e5+10;
long long a[N];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    long long ans=-2147483647;
    long long maxx=-2147483647;
    for(int i=n;i>=1;i--){
        ans=max(maxx-a[i],ans);
        maxx=max(maxx,a[i]);
    }
    cout<<ans;
    return 0;

T2.回文字符串(palindrome)

题目情况:

        10分(骗分)

题目大意:    

问题描述

​ 作为一个新手,小明刚学了回文字符串,知道了一个字符串如果关于中心对称,则该字符串为回文字符串。

​ 于是他自己就发明了属于他自己的回文字符串,即符合以下条件的字符串 �S 是回文字符串:

​ 首先把字符串 S 分割成 n 个子串 ,即 S1+S2+…+Sn=S (其中 + 为字符串拼接操作)。

​ 分割成的子串数量需要大于 1,且不能为空,即 n>1 且 Si 为非空子串。

​ 对于所有的 i∈[1,n] 有:要么 Si 与 S{n−i+1} 相等,要么 Si 与 S{n−i+1} 互为回文。(补充说明:字符串 A 和 B 互为回文指 A 倒过来与 B 相等,反之亦然。举例说明:“abc” 与 ”cba” 互为回文。)

​ 给定一个字符串 S,请你帮助小明确定该字符串是否是在上述规则下的回文字符串。

​ 如果是,他还想将字符串 S 分成尽可能多的子串。

输入格式

一行一个字符串 S。

输出格式

​ 如果不能满足要求,输出一行一个字符串 NO;否则,输出两行,第一行一个字符串 YES,第二行一个整数 n 表示最大的子串数量。

题目解析:

        1.要么 Si 与 S{n−i+1} 相等,要么 Si 与 S{n−i+1} 互为回文。

正确代码:

#include<iostream>
using namespace std;
string a,b,c;
int main(){
    string s;
    cin>>s;
    int len=s.size();
    bool flag=1;
    int ans=0;
    for(int i=0,j=len-1;i<=j;i++,j--){
        a+=s[i];
        b=s[j]+b;
        c+=s[j];
        if(i!=j&&(a==b||a==c)){
            ans+=2;
            a="";
            b="";
            c="";
        }
    }
    if(a!=""){
        ans++;
    }
    if(ans==1){
        cout<<"NO";
    }
    else{
        cout<<"YES"<<"\n";
        cout<<ans;
    }
    return 0;

T3.克隆机(clone)

题目情况:

        10分(骗分)

题目大意:

        

题目描述

有一台神奇的克隆机,可以克隆任何东西。将样品放进克隆机,可以克隆出一份一样
的“复制品”。小明得到了 k 种珍贵的植物种子,依次用 A,B,C,D,…,Z 表示(1≤k≤
26)。一开始,每种植物种子只有 1 粒。
小明想利用克隆机克隆出更多种子。将一粒种子作为样品放进克隆机,就可以得到一
粒克隆出来的相同的种子,这样一粒种子就变成了两粒种子。小明将 k 粒不同的种子按字
母先后顺序排队,从 A 开始依次放入克隆机,每次把得到的两粒相同的种子(放入的 1 粒
和克隆出来的 1 粒)放到队尾,这样不断的进行克隆。
例如,一共有 7 种不同的种子,依次用 A,B,C,D,E,F,G 表示。
第 1 粒种子 A 放进克隆机之前,队列是:A,B,C,D,E,F,G。
第 1 粒种子 A 放进克隆机之后,队列是:B,C,D,E,F,G,A,A。
第 3 粒种子 C 放进克隆机之前,队列是:C,D,E,F,G,A,A,B,B 。
第 3 粒种子 C 放进克隆机之后,队列是:D,E,F,G,A,A,B,B,C,C 。
请问第 n 粒放进克隆机的是什么种子?用 A,B,…,Z 表示。

输入描述

输入 1 行 2 个数字,k 和 n ,用空格隔开。

输出描述

输出 1 个字符,代表第 n 粒放进克隆机的种子。

题目解析:

        1.小明想利用克隆机克隆出更多种子。将一粒种子作为样品放进克隆机,就可以得到一
粒克隆出来的相同的种子,这样一粒种子就变成了两粒种子。

正确代码:

#include<iostream>
using namespace std;
int main(){
    long long k,n,t=1;
    char x;
    cin>>k>>n;
    while(k<n){
        n=n-k;
        k=k*2;
        t=t*2;
    }
    x=n/t-1+'A';
    if(n%t!=0){
        x=x+1;
    }
    cout<<x;
    return 0;
}

T4.代价(cost)

题目情况:

        0分(没骗到分😐😐😐)

题目大意:

题目描述

因为“黑发不知勤学早”,于是小明成为了一名伟大的流水线工人,天天起早摸黑打螺
丝。
这一天,小明所在的流水线生成了 n 件产品,其中第 i 号产品规格用一个正整数 ai
表示。
所谓流水线,就是需要标准化。于是,小明想把这 n 件产品规格修整得全部相同。
小明手边有两种工具来进对产品进行修整,但是使用不同工具需要花费不同的代价,
小明可以进行以下操作任意次:
· 使用一次第一种工具花费 A 的代价将第 i 件产品的规格 a​i​​ 修改成 a​i​​ + 1(其中
i ∈ [1, n])。
· 使用一次第二种工具花费 B 的代价将第 i 件产品的规格 a​i​​ 修改成 a​i​​ − 1(其中
i ∈ [1, n])。
现在小明想要花费最少的代价将所有产品的规格都变得相同,于是他找到了自幼勤学
苦练的你来帮忙。
你只需要计算出把所有产品调整为相同规格的最小代价即可。

输入描述

第一行三个正整数 n,A,B,分别表示产品数量,使用一次第一种工具的代价 A 和使用
一次第二种工具的代价 B。
第二行 n 个正整数 a1, a2, . . . , an 表示每件产品的产品规格。

输出描述

一行一个整数表示最小的总代价。

题目解析;

        1.使用一次第一种工具花费 A 的代价将第 i 件产品的规格a​i​​ 修改成 a​i​​ + 1(其中
i ∈ [1, n])。

        2.使用一次第二种工具花费 B 的代价将第 i 件产品的规格 ��a​i​​ 修改成 ��a​i​​ − 1(其中
i ∈ [1, n])。

正确代码:

#include<iostream>
#include<algorithm>
using namespace std;
long long n,a,b,x[100005],sum[100005];
int main(){
    cin>>n>>a>>b;
    for(int i=1;i<=n;i++){
        cin>>x[i];
    }
    sort(x+1,x+1+n);
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+x[i];
    }
    long long minn=0x73f3f3f3f3f3f3f3f;
    for(int i=1;i<=n;i++){
        long long temp=0,y=x[i];
        temp+=((i-1)*y-sum[i-1])*a;
        temp+=((sum[n]-sum[i])-(n-i)*y)*b;
        minn=min(minn,temp);
    }
    cout<<minn;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值