第一题:保留最大的数字
题目
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。
输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 1000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。
输出描述:
输出保留下来的结果。
示例1
输入
325 1
输出
35
分析
例如数字51643,需要删除3位数而使剩下的数字组合最大,此时需要从头开始两个数字比较大小,
如果当前数字比其下一位小,则删除当前数字,此时变为5643,继续从头开始遍历,5比6小,则删除5,变为643 继续从头遍历,当走到4的位置发现4比3大,而且4已经是倒数第二位数字,则删除最后一位数字,就得到了64 。
关键点:
- 每次j都需要从头遍历
- 2.需要考虑最后两个数字比较时,如果倒数第二位比最后一位小,需要删除最后一个数字。
代码
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
string number;
int count;
int j;
cout<<"请输入一个十进制的正整数:";
while(cin>>number)
{
cout<<"请输入要去掉的数字个数:";
cin>>count;
for(int i = 0;i<count;i++)
{
int length = number.length();
for(j = 0;j<length-1;j++)
{
if(number[j]<number[j+1])
{
number.erase(number.begin()+j);
break;
}
}
if(j == length-1) //例如51643,当j到数字倒数第二位时,4比3大,此时要删除3,
number.erase(number.end()-1);
j--; //每次都需要j--使j从数字的开始遍历。
}
cout<<number;
}
return 0;
}
第二题:彩色宝石项链
题目
有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。 有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链, 但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我, 这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。
请帮助学者找出如何切分项链才能够拿到最多的宝石。输入描述:
我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,
我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。
输出描述:
输出学者能够拿到的最多的宝石数量。每行一个
示例1
输入
ATTMBQECPD
输出
3
代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
string str;
while (cin>>str) {
int len=str.size();
string str1="";
for (int i=0;i<len-1;i++) {
str1+=str[i];
}
str+=str1;
int min=1000;
int a,b,c,d,e,index=0;
for (int i=4;i<2*len-1;i++) {
a=0,b=0,c=0,d=0,e=0;
for (int j=i;j>=0;j--) {
if (str[j]=='A') a=1;
if (str[j]=='B') b=1;
if (str[j]=='C') c=1;
if (str[j]=='D') d=1;
if (str[j]=='E') e=1;
index++;
if (a+b+c+d+e==5) {
if (index<min) {
min=index;
}
index=0;
break;
}
}
}
if (min==1000) cout<<0<<endl;
else cout<<len-min<<endl;
}
return 0;
}
第三题:袋鼠过河
题目
一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1 。
输入描述:
输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出描述:
输出最少的跳数,无法到达输出-1
1
1
输入例子:
5
2 0 1 1 1
输出例子:
4
代码
#include <iostream>
#include <string>
using namespace std;
int jump(int nums[], int n) {
if (n == 0) return 0;
int start = 0, end = 0, jumps = 0;
while (jumps<=n&&end<=n - 1){
++jumps;
int len = end;
for (int i = start; i <= end; i++){
if (nums[i] + i>len){
len = nums[i] + i;
}
}
start = end + 1;
end = len;
}
if (jumps > n)
jumps = -1;
return jumps;
}
int main(){
int n;
cin >>n;
int *array=new int[n];
for (int i = 0; i < n; i++){
cin >> array[i];
}
cout << jump(array, n);
return 0;
}