小红书C++研发编程题(AK)

//纯粹乱写,所以代码很乱,注意几个特殊情况
//一种为0, 0000, 000000,都应该处理为有数字,且为0
//二种为000012344,应该处理为12344
//三种为123RED123456处理为123123456
//至于判断谁大谁小,大家应该都会做
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <bitset>
#include <map>
#include <sstream>
#include <unordered_set>

using namespace std;
const int MAXN = 1e3 + 5;
const int INF = 0x3f3f3f3f;
const int XX = 1e3 + 5;
int n;
char str[MAXN];
char nstr[MAXN];
string cur, maxs;
int main() {
    while(~scanf("%s", str)) {
        int len = strlen(str), lt = 0;
        for(int i = 0; i < len; i ++) {
            if(!isdigit(str[i]) && i + 2 < len && str[i] == 'R' && str[i + 1] == 'E' && str[i + 2] == 'D') {
                i = i + 2;
            } else if(!isdigit(str[i])) {
                nstr[lt ++] = ' ';
            } else {
                nstr[lt++] = str[i];
            }
        }
        nstr[lt] = '\0';
        maxs = "";
        stringstream st(nstr);
        while(st >> cur) {
            int lk = 0, t = 0, zt = 0;
            for(int i = 0; i < cur.length(); ++ i) {
                if(cur[i] != '0') t = 1;
                if(cur[i] == '0') zt = 1;
                if(t)nstr[lk++] = cur[i];
            }
            if(lk == 0 && zt == 1) nstr[lk ++] = '0';
            nstr[lk] = '\0';
            cur = string(nstr);
            if(cur.length() > maxs.length()) maxs = cur;
            else if(cur == maxs) maxs = max(cur, maxs);
        }
        if(maxs.length() == 0) {
            printf("-1\n");
        } else {
            printf("%s\n", maxs.c_str());
        }
    }
    return 0;
}



//暴力模拟不解释
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <bitset>
#include <map>
#include <sstream>
#include <unordered_set>

using namespace std;
const int MAXN = 1e4 + 5;
const int INF = 0x3f3f3f3f;
const int XX = 1e3 + 5;
char str[MAXN];
int k;
int main() {
    while(~scanf("%s%d", str, &k)) {
        int l = 0, sum = 0, len = strlen(str);
        for(int i = 0;i < len;i ++){
            sum ++;
            if(sum == 2 * k){
                for(int j = l;j < l + k / 2;j ++){
                    swap(str[j], str[l + k + l - j - 1]);
                }
                l = i + 1;
                sum = 0;
            }
        }
        if(len - l >= k && len - l < 2 * k){
            for(int j = l;j < l + k / 2;j ++){
                swap(str[j], str[l + k + l - j - 1]);
            }
        }
        if(len - l < k){
            for(int j = l;j < len / 2;j ++){
                swap(str[j], str[len + l - j - 1]);
            }
        }
        printf("%s\n", str);
    }
    return 0;
}



//简单的多重背包,如果不懂请看大佬们的背包九讲,
//我的做法只是将物品分为二进制的形式,然后用01背包做
#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <bitset>
#include <map>
#include <sstream>
#include <unordered_set>

using namespace std;
const int MAXN = 1e5 + 5;
const int MAXM = 2e6 + 5;
const int INF = 0x3f3f3f3f;
const int XX = 1e3 + 5;
int n, p;
int dp[MAXM], value[MAXN];
struct YHJ {
    int a, b;
} Y[MAXN];
int main() {
    while(~scanf("%d%d", &n, &p)) {
        for(int i = 0; i < n; i ++) {
            scanf("%d%d", &Y[i].a, &Y[i].b);
        }
        int counts = 0;
        for(int i = 0; i < n; i++) {
            for(int j = 1; j <= Y[i].b; j <<= 1) {
                value[counts++] = j * Y[i].a;
                Y[i].b -= j;
            }
            if( Y[i].b > 0) {
                value[counts++] = Y[i].b * Y[i].a;
            }
        }
        memset(dp, 0, sizeof(dp));
        for(int i = 0; i < counts; i++) {
            for(int j = p; j >= value[i]; j--) {
                dp[j] = max(dp[j], dp[j - value[i]] + value[i]);
            }
        }
        printf("%d\n", p - dp[p]);
    }
    return 0;
}


#C++工程师#
全部评论

相关推荐

迷茫的大四🐶:看来已经准备换人了
点赞 评论 收藏
分享
评论
点赞
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务