Manthan, Codefest 18 (rated, Div. 1 + Div. 2) 简单题

版权声明:吸猫大法、 https://blog.csdn.net/sasuke__/article/details/82385552

A
题意: 把n个硬币分成几部分, 某些部分的和能组成1~n范围内的所有整数

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>

using namespace std;

#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)

const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;

int main() {
    int n;  scanf("%d", &n);
    int bin = 1;
    int ans = 0;
    while (n - bin > 0) {
        ans++;
        n -= bin;
        bin <<= 1;
    }
    if (n > 0)  ans++;
    printf("%d\n", ans);
    return 0;
}

B
题意: 只有一种操作对某个元素进行加1或者减1, 最后让数组的中位数是s, 求最少操作数

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>

using namespace std;

#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)

const int qq = 2e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int n, m;
int num[qq];
int a[qq], b[qq];

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) {
        scanf("%d", num + i);
    }
    sort(num, num + n);
    int big = 0;
    for (int i = 0; i < n; ++i) {
        if (num[i] >= m)    a[big++] = num[i];
    }
    int small = 0;
    for (int i = n - 1; i >= 0; --i) {
        if (num[i] < m)     b[small++] = num[i];
    }
    LL ans = 0;
    if (big > small) {
        int cnt = 0;
        while (small + cnt < (n + 1) / 2) {
            ans += a[cnt++] - m;
        } 
    } else {
        int cnt = 0;
        while (big + cnt < (n + 1) / 2) {
            ans += m - b[cnt++];
        }
    }
    printf("%lld\n", ans);
    return 0;
}

C
题意: 两种操作第一种操作是将一个0变成1或者1变成0 代价是1, 或者将两个位置上的数字进行交换, 代价是|i - j|. 现在让你将a串变为b串, 求最小代价.

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>

using namespace std;

#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)

const int qq = 1e6 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int n;
string x, y;
int dp[qq];

int main() {
    cin >> n;
    cin >> x >> y;
    dp[0] = 0;
    for (int i = 1; i <= n; ++i) {
        if (x[i - 1] == y[i - 1]) {
            dp[i] = dp[i - 1];
        } else {
            dp[i] = dp[i - 1] + 1;
            if (i > 1 && x[i - 1] == y[i - 2] && x[i - 2] == y[i - 1]) {
                dp[i] = min(dp[i], dp[i - 2] + 1);
            }
        }
    }
    cout << dp[n] << endl;
    return 0;
}

D
题意: 给出一棵树, 然后给出一个bfs的访问序列, 问这个序列是否合法

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>

using namespace std;

#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)

const int qq = 2e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int dep[qq], pre[qq], n;
vector<int> vt[qq];

void dfs(int u, int fa) {
    pre[u] = fa;
    dep[u] = dep[fa] + 1;
    int sz = vt[u].size();
    for (int i = 0; i < sz; ++i) {
        int v = vt[u][i];
        if (v == fa)    continue;
        dfs(v, u);
    }
}
int path[qq];

vector<int> nodeDep[qq];


int main() {
    scanf("%d", &n);
    for (int i = 1, a, b; i < n; ++i) {
        scanf("%d%d", &a, &b);
        vt[a].pb(b), vt[b].pb(a);
    }
    dfs(1, 0);
    for (int i = 1; i <= n; ++i) {
        sort(vt[i].begin(), vt[i].end());
    }
    bool f = true;
    int pre = 0;
    for (int i = 0; i < n; ++i) {
        scanf("%d", path + i);
        nodeDep[dep[path[i]]].pb(path[i]);
        int flag = dep[path[i]] - pre;
        pre = dep[path[i]];
        if (flag < 0 || flag > 1) f = false;
    }
    if (path[0] != 1 || !f) {
        puts("No");
        return 0;
    }
    for (int i = 1; i <= n && f; ++i) {
        if (nodeDep[i].size() == 0) continue;
        int start = 0;
        for (int j = 0; j < nodeDep[i].size() && f; ++j) {
            int u = nodeDep[i][j];
            int sz = vt[u].size();
            if (u != 1) sz--;
            for (int k = 0; k < sz && f; ++k) {
                int v = nodeDep[i + 1][start];
                int id = lower_bound(vt[u].begin(), vt[u].end(), v) - vt[u].begin();
                start++;
                if (vt[u][id] != v) f = false;
            }
        }
    }
    puts(f ? "Yes" : "No");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sasuke__/article/details/82385552
今日推荐