首页 > 腾讯8.23笔试 后台
头像
澹台棋晴
编辑于 2020-08-24 14:24
+ 关注

腾讯8.23笔试 后台

1 删除链表

#include
#include
#include
using namespace std;
int main()
{
    int n,k,m;
    scanf("%d %d",&n,&k);
    scanf("%d",&m);
    if(k != 1)
        printf("%d ",m);
    for(int i=2;i<=n;i++){
        scanf("%d",&m);
        if(i != k)
            printf("%d ",m);
    }
    return 0;
}

2 最小k字符串 :没写出来
3 两个数的拆分之和

// 思路678  分为99 和剩余的部分的  使得9最多就可以了,这样一定是最大的

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
long long get_ws(long long n){
    long long k =0;
    while(n>0){
        n /=10;
        k = k*10 + 9;
    }
    return k/10;

}
int main(){
    long long res,k,m,j;
    int n;
    scanf("%d",&n);
    while(n--){
        scanf("%ld",&m);
        if(m < 19){
            printf("%d\n",m);
            continue;
        }
        k = get_ws(m);
        j = m - k;
        res = 0;
        while(k > 0){
            res += k % 10;
            k /= 10;
        }
        while(j > 0){
            res += j % 10;
            j /= 10;
        }

    }
    printf("%ld", res);
    return 0;
}

4 刷木板的问题 DP问题

#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int N =5050;
int a[N];
int solve(int l,int r){
    if(l > r)
        return 0;

    int k = l;
    for(int i = l; i <= r;i++){
        if(a[k] > a[i])
            k = i;

    }//找到最短的
    int sum = a[k];
    for(int i = l;i <= r; i++){//所有数都减去这个最小的数
        a[i] -= sum;
    }
    return min(r - l + 1, solve(l,k-1) + solve(k + 1,r) + sum);//在横着涂和竖着涂中取最小值

}

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        scanf("%d",&a[i]);
    }
    printf("%d\n",solve(0,n-1));

    return 0;
}

5 回文串问题

/*
f(i,j)表示 i到j 判断是不是会回文串
f(i,j) = min(f(i,j),f(i,k)+f(k+1,j))
*/

#include<iostream>
#include<cstring>

#include<stdio.h>
using namespace std;
int f[505][505];
string s;
bool is_huiwen(int l,int r){
    while(l <= r){
        if(s[l] != s[r]){
            break;

        }
        l++;
        r--;
    }
    if(l >= r){
        return true;
    }
    else{
        return false;
    }
}
int main(){
    int n;
    int l,r;

    cin>>s;
    n = s.size();
    for(int i=0 ;i <n;i++){
        for(int j =0; j<n;j++){
            f[i][j] = j - i + 1;
        }
        f[i][i] = 1;
    }
    for(int i=0 ;i <n;i++){
        for(int j =i+1; j<n;j++){
                if(is_huiwen(i,j))
                    f[i][j] = 1;
        }

    }
    for(int i=0 ;i < n;i++){
        for(int j =i+1; j<n;j++){
            for(int k = i; k<j;k++){
                if(f[i][k] + f[k+1][j] < f[i][j]){
                    f[i][j] = f[i][k] + f[k+1][j];
                }
            }
        }

    }
    scanf("%d",&n);
    while(n--){
        scanf("%d %d",&l,&r);
        l--;
        r--;//数组坐标是0开始,实际上的r和l是1开始
        if(l <= r){
            printf("%d\n",f[l][r]);
        }
        else{
            printf("%d\n",f[r][l]);
        }
    }
    return 0;
}

全部评论

(1) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐