2018年8月30日拼多多笔试题题解

好久没水贴了,发一个凑凑热闹(

第一题:打怪物,贪心,比一下蓄力和不蓄力区别就行了

#include <bits/stdc++.h>
using namespace std;
long long int hp, n, b;
int ans = 0;
int main() {
    std::ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    cin >> hp >> n >> b;
    ans = 0;
    if (2*n > b) {
        long long int t = hp / (2*n);
        ans += t*2;
        t = hp % (2*n);
        while(t > 0) {
            t -= n;
            ans ++;
        }
    } else {
        long long int t = hp / b;
        ans += t*2;
        t = hp % b;
        int c = 0;
        while(t > 0) {
            t -= n;
            c ++;
        }
        ans = ans + min(c, 2);
    }
    cout << ans << endl;
    return 0;
}

第二题:模拟按规则木块下落

#include <bits/stdc++.h>
using namespace std;
int n, m;
char mat[20][20];
int main() {
    std::ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; ++i) {
        scanf("%s", &mat[i]);
    }
    for (int i = 0; i < m; ++i) {
        for (int j = n-1; j >= 0; --j) {
            if (mat[j][i] == 'x') continue;
            if (mat[j][i] == '.') continue;

            int now = j;
            int k = j + 1;
            while(k < n) {
                if (mat[k][i] == 'x') break;
                if (mat[k][i] == 'o') break;
                swap(mat[k][i], mat[now][i]);
                now ++;
                k ++;
            }
            if (k == n) {
                mat[now][i] = '.';
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        printf("%s\n", mat[i]);
    }

    return 0;
}

第三题:求小数循环节开始和循环节长度
模拟除法

#include <bits/stdc++.h>
using namespace std;
int n, m;
unordered_map<int, int> ma;
pair<int, int> solve(int n, int m) {
    ma.clear();
    int now = 0;
    int t, h;
    n = n % m;
    while(true) {
        n = n % m;
        t = n % m;
        if (ma.find(n) == ma.end()) {
            ma[n] = now;
        } else {
            h = now - ma[n];
            return make_pair(ma[n], h);
        }
        //cout << n << " " << m << " " << t << endl;
        if (t == 0) {
            return make_pair(now, 0);
        }
        n = t;
        n *= 10;
        now ++;
    }
}
int main() {
    std::ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    cin >> n >> m;
    auto ans = solve(n, m);
    cout << ans.first << " " << ans.second << endl;
    return 0;
}

第四题:按照字典序dfs一下就行了,输入最大为2000个字符串,所以蛮快的,2000次必结束

#include <bits/stdc++.h>
using namespace std;
int n, m;
string sarr[2005];
set<string> se;
set<char> cse[15];
string gs;
bool flag = false;
string ans;
void dfs(int id) {
    if (id >= m) {
        // find
        if (se.find(gs) != se.end()) {
            return;
        } else {
            ans = gs;
            flag = true;
            return;
        }

    }
    auto it = cse[id].begin();
    while(it != cse[id].end()) {
        gs[id] = *it;
        dfs(id + 1);
        if (flag) return;
        ++it;
    }
}
int main() {
    std::ios::sync_with_stdio(false);
    //freopen("input.txt", "r", stdin);
    cin >> n >> m;
    for (int i = 0; i < n; ++i) {
        cin >> sarr[i];
        se.insert(sarr[i]);
        for (int j = 0; j < m; ++j) {
            cse[j].insert(sarr[i][j]);
        }
    }
    gs = "";
    for (int i = 0; i < m; ++i) gs += 'a';
    flag = false;
    dfs(0);
    if (flag) {
        cout << ans << endl;
    } else {
        cout << "-" << endl;
    }
    return 0;
}
#拼多多##题解#
全部评论
我来发个Java的 import java.util.Scanner; /** * 贪心 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); long hp = in.nextLong(); long x = in.nextLong(); long y = in.nextLong(); long ans1 = hp / x; if (hp % x != 0) { ans1++; } long ans2 = hp / (y) * 2; hp %= y; long ans; if (hp == 0) { } else if (hp <= x) { ans2++; } else { ans2 += 2; } ans = Math.min(ans1, ans2); System.out.println(ans); } } import java.util.Scanner; /** * 模拟 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int m = in.nextInt(); char[][] a = new char[n][m]; in.nextLine(); for (int i = 0; i < n; i++) { String line = in.nextLine(); a[i] = line.toCharArray(); } for (int j = 0; j < m; j++) { int s = 0; for (int i = 0; i < n; i++) { if (a[i][j] == 'o') { a[i][j] = '.'; s++; } if (a[i][j] == 'x') { for (int k = 1; k <= s; k++) { a[i-k][j] = 'o'; } s = 0; } } } for (int i = 0; i < n; i++) { System.out.println(a[i]); } } } import java.util.Map; import java.util.Scanner; import java.util.TreeMap; /** * 模拟 */ public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int a = in.nextInt(); int b = in.nextInt(); Map<Integer, Integer> mp = new TreeMap<>(); a %= b; for (int i = 0; ;i++) { int x = a % b; if (x == 0) { System.out.println(i + " 0"); break; } Integer t = mp.get(x); if (t != null) { System.out.printf("%d %d\n", t, i - t); break; } mp.put(x, i); a = x * 10; } } } import java.util.*; /** * 深搜 */ public class Main { static int n; static int l; static List<Set<Character> > b; static Set<String> st; static boolean flag = false; static void dfs(int k, StringBuilder sb) { if (flag) { return; } if (k == l) { if (!st.contains(sb.toString())) { System.out.println(sb); flag = true; } return; } b.get(k).forEach(character -> { StringBuilder ssb = new StringBuilder(sb); ssb.append(character); dfs(k + 1, ssb); }); } public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); l = in.nextInt(); in.nextLine(); String[] s = new String[n]; st = new TreeSet<>(); for (int i = 0; i < n; i++) { s[i] = in.nextLine(); st.add(s[i]); } b = new ArrayList<>(); for (int i = 0; i < l; i++) { b.add(new TreeSet<>()); } for (int j = 0; j < l; j++) { for (int i = 0; i < n; i++) { b.get(j).add(s[i].charAt(j)); } } dfs(0, new StringBuilder()); if (!flag) { System.out.println("-"); } } }
点赞
送花
回复
分享
发布于 2018-08-30 21:04
大牛! 我就做出了第一题。。。感觉自己凉凉了
点赞
送花
回复
分享
发布于 2018-08-30 21:02
秋招专场
校招火热招聘中
官网直投
循环小数(纯C语言版) #include <stdio.h> int main() {         int a, b;         scanf("%d %d", &a, &b);         if(a%b == 0)         {                 printf("0 0\n");                 return 0;         }         int temp[b], i;         for(i=0; i<b; i++)                 temp[i] = -1;         int pos = 0;         a = a % b;         temp[a] = pos;         while(a != 0)         {                 pos++;                 a = a * 10 % b;                 if(temp[a] != -1)                 {                         printf("%d %d\n", temp[a], pos-temp[a]);                         return 0;                 }                 temp[a] = pos;         }         printf("%d %d\n", pos, 0);         return 0; }
点赞
送花
回复
分享
发布于 2018-09-01 12:20
90 100 80 70能过吗😟
点赞
送花
回复
分享
发布于 2018-08-30 21:01
2.9...感觉题目挺简单。。。没发挥好
点赞
送花
回复
分享
发布于 2018-08-30 21:02
ac3.9,爽
点赞
送花
回复
分享
发布于 2018-08-30 21:04
哎。。。第一题一开始用dp做的,超限制,然后跳去做后面了,回来再做第一题发现好像不用dp,直接比较就可以,奈何没写完就交卷了。。。。哭瞎。感觉这么简单大家应该都4ac了吧。。。。凉凉
点赞
送花
回复
分享
发布于 2018-08-30 21:07
凉凉
点赞
送花
回复
分享
发布于 2018-08-30 21:08
第三题的啥意思啊,到现在没理解。 1/3 为什么是0 1    (0循环小数的开始位置,就是小数点后0位开始?为什么长度是1?不是无穷么?) 5/4 为什么是2 0?  (5/4不是1.25么,如果按照上面这么理解,开始位置不应该也是0么?为什么是2? )
点赞
送花
回复
分享
发布于 2018-08-30 21:24
大佬帮我看看我这里哪有问题啊,感觉是和你的一样啊,为什么只有40%呢。 def solution(board):     for i in range(N-1, -1, -1):         for j in range(M):             if i == N-1:                 if board[i][j] == '.' or board[i][j] == 'o':                     board[i][j] = '.'                 else:                     continue             else:                 if board[i][j] == 'x':                     continue                 elif board[i][j] == '.':                     continue                 else:                     if board[i+1][j] == '.':                         for k in range(i+2,N):                             if board[k][j] == 'x' or board[k][j] == 'o':                                 board[k-1][j] = 'o'                         board[i][j] = '.'                     else:                         continue     return board N,M = map(int, input().split()) board = [] for i in range(N):     board.append(list(input()))      for row in solution(board):     print(''.join(row))
点赞
送花
回复
分享
发布于 2018-08-30 21:30
问下第三题 按照楼主的思路 1 /19=0.052631578947368... 按这个思路是不是 输出 1 5? 但是这个位置根本不是循环吧
点赞
送花
回复
分享
发布于 2018-08-30 22:11
大佬厉害呀
点赞
送花
回复
分享
发布于 2018-08-31 00:27

相关推荐

点赞 60 评论
分享
牛客网
牛客企业服务