一、题目报告
第一题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,..a1,a2,..an,依次表示小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 件产品的规格 ai 修改成 ai + 1(其中
i ∈ [1, n])。
· 使用一次第二种工具花费 B 的代价将第 i 件产品的规格 ai 修改成 ai − 1(其中
i ∈ [1, n])。
现在小明想要花费最少的代价将所有产品的规格都变得相同,于是他找到了自幼勤学
苦练的你来帮忙。
你只需要计算出把所有产品调整为相同规格的最小代价即可。
输入描述
第一行三个正整数 n,A,B,分别表示产品数量,使用一次第一种工具的代价 A 和使用
一次第二种工具的代价 B。
第二行 n 个正整数 a1, a2, . . . , an 表示每件产品的产品规格。
输出描述
一行一个整数表示最小的总代价。
题目解析;
1.使用一次第一种工具花费 A 的代价将第 i 件产品的规格ai 修改成 ai + 1(其中
i ∈ [1, n])。
2.使用一次第二种工具花费 B 的代价将第 i 件产品的规格 ��ai 修改成 ��ai − 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;
}
2115

被折叠的 条评论
为什么被折叠?



