蓝桥杯刷题(三)

简介: 蓝桥杯刷题

拼数:


题目描述

设有 n 个正整数 a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。


输入格式

第一行有一个整数,表示数字个数 n。


第二行有 n 个整数,表示给出的 n 个整数 ai。


输出格式

一个正整数,表示最大的整数


输入输出样例

输入 #1复制


3

13 312 343

输出


34331213

输入


4

7 13 4 246

输出


7424613

说明/提示

对于全部的测试点,保证 1≤n≤20,11≤ai≤109。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string s[21];int n;
bool cmp(string a,string b) { // &表示引用
    return (a+b > b+a);
}
int main(void) {
    cin >> n;
    for(int i=1;i<=n;++i) cin >> s[i];
    sort(s+1,s+n+1,cmp);
    for (int i=1;i<=n;++i) cout << s[i];
    return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int n;
string a[25];
bool b[25];
bool check(string a,string b){
  if(a.compare(b)!=-1){
      return true;
  }else{
    return false;
  }
}
void kuaipai(string a[],int l,int r){
  if(l>=r){
    return;
  }
  string k=a[r];
  int i=l,j=r;
  while(i<j){
    while(i<j&&a[i]<=k) i++;
    a[j]=a[i];
    while(i<j&&a[j]>=k) j--;
    a[i]=a[j];
  }
  a[i]=k;
  kuaipai(a,i+1,r);
  kuaipai(a,l,i-1);
}
int main(){
  cin>>n;
  if(n==0){
    cout<<0;
    return 0;
  }
  string c="";
  for(int i=0;i<n;i++){
    cin>>a[i];
    c+=a[i]+'0';
  }
   int len=c.size();
  kuaipai(a,0,n-1);
  string ans;
  for(int i=n-1;i>=0;i--){
    ans+=a[i];
  }
  cout<<ans;
  return 0;
}

排序:


小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。


在冒泡排序中,每次只能交换相邻的两个元素。


小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。


例如,对于字符串 lanlan 排序,只需要 11 次交换。对于字符串 qiao 排序,总共需要 44 次交换。


小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100次交 换,可是他忘了吧这个字符串记下来,现在找不到了。


请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对 该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。


运行限制

最大运行时间:1s

#include <iostream>
using namespace std;
int main()
{
//考虑冒泡排序的复杂度,对于拥有N个字母的字符串,最多需要交换N*(N-1)/2次(完全乱序时)
//易知N=15时,有15*14/2=105,即满足100次交换所需的最短字符串有15个字母。
//要求字典序最小,那么显然要取a~o这15个字典序最小的字母
/*
  逆向思考,目标字符串经过100次交换后,得到正序字符串abcdefghijklmno,而完全逆序的字符串onmlkjihgfedcba变成正序字符串需要105次交换,那么将完全逆序的字符串交换5次后,便能得到答案。
  而要求字典序最小,那么将j交换5次提到字符串最前面,就得到了最小的情况
*/
  printf("jonmlkihgfedcba");
  return 0;
}

数字三角形:

题目描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。



路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。


输入描述

输入的第一行包含一个整数 (1≤N≤100),表示三角形的行数。


下面的 NN 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。


输出描述

输出一个整数,表示答案。


输入输出样例

示例


输入


5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

输出

27

运行限制

最大运行时间:1s

最大运行内存: 256M

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int a[105][105];
int n;
int dp[105][105];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            cin>>a[i][j];
        }
    }
    int floge=0;
    dp[1][1]=a[1][1];
    for(int i=2;i<=n;i++){
        for(int j=1;j<=i;j++){
            dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+a[i][j];
        }
    }
    cout<<max(dp[n][(n+1)/2],dp[n][(n+2)/2]);
    return 0;
}


递增序列:


题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。


对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下看是递增的。


例如,如下矩阵中

LANN
QIAO

有LN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、ANLN、LN、AN、AN、IO、AO、LQ、AI、NO、NO、AQ、IN、AN 等 13 个 递增序列。注意当两个字母是从左下到右上排列时,从左向右看和从上向下看 是不同的顺序。


对于下面的 30行 50 列的矩阵,请问总共有多少个递增序列?

VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG
SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASATDWZAPZRNHTNNGQF
ZGUGXVQDQAEAHOQEADMWWXFBXECKAVIGPTKTTQFWSWPKRPSMGA
BDGMGYHAOPPRRHKYZCMFZEDELCALTBSWNTAODXYVHQNDASUFRL
YVYWQZUTEPFSFXLTZBMBQETXGXFUEBHGMJKBPNIHMYOELYZIKH
ZYZHSLTCGNANNXTUJGBYKUOJMGOGRDPKEUGVHNZJZHDUNRERBU
XFPTZKTPVQPJEMBHNTUBSMIYEGXNWQSBZMHMDRZZMJPZQTCWLR
ZNXOKBITTPSHEXWHZXFLWEMPZTBVNKNYSHCIQRIKQHFRAYWOPG
MHJKFYYBQSDPOVJICWWGGCOZSBGLSOXOFDAADZYEOBKDDTMQPA
VIDPIGELBYMEVQLASLQRUKMXSEWGHRSFVXOMHSJWWXHIBCGVIF
GWRFRFLHAMYWYZOIQODBIHHRIIMWJWJGYPFAHZZWJKRGOISUJC
EKQKKPNEYCBWOQHTYFHHQZRLFNDOVXTWASSQWXKBIVTKTUIASK
PEKNJFIVBKOZUEPPHIWLUBFUDWPIDRJKAZVJKPBRHCRMGNMFWW
CGZAXHXPDELTACGUWBXWNNZNDQYYCIQRJCULIEBQBLLMJEUSZP
RWHHQMBIJWTQPUFNAESPZHAQARNIDUCRYQAZMNVRVZUJOZUDGS
PFGAYBDEECHUXFUZIKAXYDFWJNSAOPJYWUIEJSCORRBVQHCHMR
JNVIPVEMQSHCCAXMWEFSYIGFPIXNIDXOTXTNBCHSHUZGKXFECL
YZBAIIOTWLREPZISBGJLQDALKZUKEQMKLDIPXJEPENEIPWFDLP
HBQKWJFLSEXVILKYPNSWUZLDCRTAYUUPEITQJEITZRQMMAQNLN
DQDJGOWMBFKAIGWEAJOISPFPLULIWVVALLIIHBGEZLGRHRCKGF
LXYPCVPNUKSWCCGXEYTEBAWRLWDWNHHNNNWQNIIBUCGUJYMRYW
CZDKISKUSBPFHVGSAVJBDMNPSDKFRXVVPLVAQUGVUJEXSZFGFQ
IYIJGISUANRAXTGQLAVFMQTICKQAHLEBGHAVOVVPEXIMLFWIYI
ZIIFSOPCMAWCBPKWZBUQPQLGSNIBFADUUJJHPAIUVVNWNWKDZB
HGTEEIISFGIUEUOWXVTPJDVACYQYFQUCXOXOSSMXLZDQESHXKP
FEBZHJAGIFGXSMRDKGONGELOALLSYDVILRWAPXXBPOOSWZNEAS
VJGMAOFLGYIFLJTEKDNIWHJAABCASFMAKIENSYIZZSLRSUIPCJ
BMQGMPDRCPGWKTPLOTAINXZAAJWCPUJHPOUYWNWHZAKCDMZDSR
RRARTVHZYYCEDXJQNQAINQVDJCZCZLCQWQQIKUYMYMOVMNCBVY
ABTCRRUXVGYLZILFLOFYVWFFBZNFWDZOADRDCLIRFKBFBHMAXX

运行限制

最大运行时间:1s

最大运行内存: 128M

#include <iostream>
#include <cmath>
using namespace std;
int ans;
char a[35][55];
int main(){
  for(int i=0;i<30;i++){
    for(int j=0;j<50;j++){
      cin>>a[i][j];
    }
  }
  for(int i=0;i<30;i++){
    for(int j=0;j<50;j++){
      for(int x=0;x<30;x++){
        for(int y=0;y<50;y++){
          if(i==x && j==y){
            continue;
          }
          int c=abs(i-x);
          if(i==x && a[i][j]<a[x][y] && y>j){
            ans++;
          }
          if(j==y && a[i][j]<a[x][y] && x>i) {
            ans++;
          }
          if(i+j==x+y && x>i && a[i][j]!=a[x][y]){
            ans++;
          }
          if(j+c==y && x>i&&a[i][j]<a[x][y]){
            ans++;
          }
        }
      }
    }
  }
  cout<<ans;
  return 0;
}

相关文章
|
6月前
|
测试技术
蓝桥杯刷题|03入门真题
蓝桥杯刷题|03入门真题
|
6月前
|
测试技术
蓝桥杯刷题|01入门真题
蓝桥杯刷题|01入门真题
|
6月前
|
测试技术
蓝桥杯刷题|02入门真题
蓝桥杯刷题|02入门真题
蓝桥杯刷题-1
蓝桥杯刷题-1
100 1
|
机器学习/深度学习
蓝桥杯刷题(一)
蓝桥杯刷题
109 0
|
机器学习/深度学习
蓝桥杯真题练习
蓝桥杯真题练习
159 0
蓝桥杯真题计划(一)
蓝桥杯真题计划(一)
72 0
|
前端开发
牛客刷题Day3
牛客刷题Day3
93 0