时间限制: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,..a1,a2,..an,依次表示小A 要经过的城市的纪念品的价格。
输出格式
输出一个整数, 表示小A能赚到钱的最大值。
输入样例1
5
2 1 6 8 4
输出样例1
7
样例 1 解释
在 22 号城市花 11 元买,在 44 号城市 88 元卖掉,赚 77 元。
输入样例2
6
10 8 7 5 3 1
输出样例2
-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
abcababcba
输出样例1
YES
8
样例 1 解释
最多可以把字符串分成 (a)(b)(c)(ab)(ab)(c)(b)(a) 共 8 个子串。
输入样例2
goodluckhavefun
输出样例2
NO
样例 2 解释
很显然不存在满足题意的分割方案。
输入样例3
wahacodewaha
输出样例3
YES
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 输入
7 10
样例1 输出
B
样例1 解释
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
种子 | A | B | C | D | E | F | G | A | A | B | B |
样例2 输入
26 80
样例2 输出
A
样例3 输入
15 689
样例3
G
数据范围
对于 50% 的数据,1≤1061≤n≤106 ;
对于 100% 的数据,1≤26,1≤10181≤k≤26,1≤n≤1018
#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;
}