CSP-x

时间限制:1秒        内存限制:128M

问题描述

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

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

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

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

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

输入格式

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

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

输出格式

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

输入样例1
  1. 5
  2. 2 1 6 8 4
输出样例1
  1. 7
样例 1 解释

在 22 号城市花 11 元买,在 44 号城市 88 元卖掉,赚 77 元。

输入样例2
  1. 6
  2. 10 8 7 5 3 1
输出样例2
  1. -1
样例 2 解释

在 22 号城市花 88 元买,在 33 号城市 77 元卖掉,赚 −1−1 元,即亏了 11 元。

数据范围

30%的数据:n≤1000。

100%的数据:2≤n≤200000,0< a[i] ≤2000000000。

来看看AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
long long n,a[N],minn,ans=-2147483647;
int main(){
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    minn=a[1];
    for(int i=2;i<=n;i++){
        ans=max(ans,a[i]-minn);
        minn=min(minn,a[i]);
    }
    printf("%lld\n",ans);
	return 0;
}

时间限制:1秒        内存限制:128M

问题描述

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

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

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

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

​ 对于所有的 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
 
  1. abcababcba
输出样例1
 
  1. YES
  2. 8
样例 1 解释

最多可以把字符串分成 (a)(b)(c)(ab)(ab)(c)(b)(a) 共 8 个子串。

输入样例2
 
  1. goodluckhavefun
输出样例2
 
  1. NO
样例 2 解释

很显然不存在满足题意的分割方案。

输入样例3
 
  1. wahacodewaha
输出样例3
 
  1. YES
  2. 3
样例 3 解释

最多可以把字符串分成 (waha)(code)(waha) 共 3 个子串。

数据范围

对于 30% 的数据,1≤|S|≤10;(其中 |S| 为给定字符串的长度)

对于 60% 的数据,1≤|S|≤1000;

其中有 30% 的数据输入的字符串为回文字符串;

对于 100% 的数据,1≤|S|≤10000,保证输入的字符串全为小写字母。

#include<bits/stdc++.h>
using namespace std;
string qian="";
string s,a,c,b;
int ans=0;
int main(){
    cin>>s;
    int len=s.size();
    if(len==1){
        cout<<"NO";
        return 0;
    }
    for(int i=0,j=len-1;i<=j;i++,j--){
        a=a+s[i];
        b=s[j]+b;
        c=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"<<endl<<ans;
    return 0;
}

时间限制:1秒        内存限制:512M

题目描述

有一台神奇的克隆机,可以克隆任何东西。将样品放进克隆机,可以克隆出一份一样
的“复制品”。小明得到了 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 输入
 
  1. 7 10
样例1 输出
 
  1. B
样例1 解释
序号1234567891011
种子ABCDEFGAABB
样例2 输入

26 80

样例2 输出

A

样例3 输入

15 689

样例3   

G

数据范围

对于 50% 的数据,1≤1061≤n≤10​6​​ ;
对于 100% 的数据,1≤26,1≤10181≤k≤26,1≤n≤10​18​​

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

第四题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
long long n,A,B,a[N],sum[N];
int main(){
    cin>>n>>A>>B;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        sum[i]=sum[i-1]+a[i];
    }
    long long minn=0x3f3f3f3f3f3f3f3f;
    for(int i=1;i<=n;i++){
        long long temp=0,x=a[i];
        temp+=((i-1)*x-sum[i-1])*A;
        temp+=((sum[n]-sum[i])-(n-i)*x)*B;
        minn=min(minn,temp);
    }
    cout<<minn;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值