哈尔滨华德学院天梯赛选拔赛

Source

A - 善良的xmy

直接输出就可以啦,签到题.

参考代码:

#include <bits/stdc++.h>

int main() {
    printf("xmy zui shan liang.");
    return 0;
}

B-wenju丢失身份证

注意格式化输入.

参考代码:

#include <bits/stdc++.h>

int main() {
    int h1, m1, s1, h2, m2, s2;
    scanf("%d:%d:%d - %d:%d:%d", &h1, &m1, &s1, &h2, &m2, &s2);
    int n, m;
    n = h1 * 3600 + m1 * 60 + s1;
    m = h2 * 3600 + m2 * 60 + s2;
    printf("%d\n", m - n);
    return 0;
}

C-温巨在装萌新

签到题.

参考代码:

#include <bits/stdc++.h>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::string s;
    std::cin >> s;
    if (s.substr(0, 10) == "1134728508") {
        std::cout << "Yes\n";
    } else {
        std::cout << "No\n";
    }
    return 0;
}

D-白神遥的忧伤

直接计算即可,但是数据范围貌似除了问题,n 和 m要定义成long long类型,我因此WA了一发.

参考代码:

#include <bits/stdc++.h>
using i64 = long long;

template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int t;
    read(t);
    while (t--) {
        i64 n, m;
        read(n), read(m);
        i64 ans = n * m;
        if (n == 5 && m == 8) {
            ans = 35;
        } else if (n == 8 && m == 5) {
            ans = 35;
        } else {
            ans = n * m;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

E-负债的东爱璃Lovely

签到题.

参考代码:

#include <bits/stdc++.h>
using i64 = long long;

template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int n, m;
    read(n), read(m);
    std::vector<int> a(n);
    int cnt = 0;
    for (int i = 0; i < n; i++) {
        read(a[i]);
        cnt += a[i];
    }
    printf("%d\n", std::max(0, m - cnt * 12) * 2);
    //保证结果不为负数
    return 0;
}

F-清楚姐姐机器人化

模拟.

参考代码:

#include <bits/stdc++.h>

std::string s;
int n, ans, cnt;

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cin >> n;
	for (int i = 0; i < n; i++) {
		std::cin >> s;
		if (s.substr(0,9) == "234186389") {
            //是清楚学姐发的
			cnt++;
			if (s.find("competition") != std::string::npos)
				ans++;
            //跟比赛有关
		}
	}
	std::cout << ans - (cnt - ans);
    return 0;
}

G-在考研的卷王

用std::map轻松搞定.

参考代码:

#include <bits/stdc++.h>

template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int n; read(n);
    std::vector<int> a(n);
    std::map<int, int> mp;
    for (int i = 0; i < n; i++) {
        read(a[i]);
        mp[a[i]]++;
    }
    for (auto it : mp) {
        printf("%d %d\n", it.first, it.second);
    }
    return 0;
}

H-想不到出什么的xmy,出了个极简版本机器人

还是std::map.

参考代码:

#include <bits/stdc++.h>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::map<std::string, std::string> mp;
    std::map<std::string, bool> vis;
    int n, m;
    std::cin >> n >> m;
    for (int i = 0; i < n; i++) {
        std::string s, t;
        std::cin >> s >> t;
        mp[s] = t;
        mp[t] = s;
        vis[t] = true;
        vis[s] = true;
    }
    for (int i = 0; i < m; i++) {
        std::string s;
        std::cin >> s;
        if (vis[s]) {
            std::cout << mp[s] << "\n";
        } else {
            std::cout << "jlstxdy\n";
        }
    }
    return 0;
}

I-质数筛

x <= 1e6,直接试除法即可.

参考代码:

#include <bits/stdc++.h>

bool isprime(int n)
{
    if (n == 0 || n == 1)
        return false;
    if (n == 2 || n == 3 || n == 5)
        return true;
    if (n % 2 == 0 || n % 3 == 0)
        return false;
    for (int i = 5; i * i <= n; i += 6)
        if (n % i == 0 || n % (i + 2) == 0)
            return false;
    return true;
}


template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int n, k;
    read(n), read(k);
    for (int i = 0; i < k; i++) {
        int x;
        read(x);
        if (isprime(x) && x <= n) {
            printf("yes\n");
        } else {
            printf("no\n");
        }
    }
    return 0;
}

J-质数筛II

数据太大,貌似只能用std::map来标记了. 

参考代码:

#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using i64 = long long;
constexpr int MOD = 998244353, N = 2e6 + 10, inf = 2e9;

int prime[N], idx;
std::map<int, bool> v;

void GetPrime(int n) {
	for (int i = 2; i <= n; i++) {
		if (v[i]) continue;
		prime[idx++] = i;
		for (int j = i; j <= n/i; j++) v[i * j] = 1;
	}
}

template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int n; read(n);
    n = std::sqrt(n);
	GetPrime(n);
	if (n < 2) {
        printf("-1\n");
    }
	for (int i = 0; i < idx; i++) {
        printf("%lld\n", 1LL * prime[i] * prime[i]);
    }
    return 0;
}

K-小雪买巧克力

暴力枚举.

参考代码:

#include <bits/stdc++.h>

using i64 = long long;
 
template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

int main() {
    int n; read(n);
    i64 max = -1 * 1LL * inf;
    int first = n / 28, second = n / 25, third = n / 20;
    int res1, res2, res3;
    for (int i = 0; i <= first; i++) {
        for (int j = 0; j <= second; j++) {
            for (int k = 0; k <= third; k++) {
                i64 sum = i * 28 + j * 25 + k * 20;
                if (sum <= n) {
                    i64 ans = i * 70 + j * 50 + k * 30;
                    if (ans > max) {
                        max = ans;
                        res1 = i, res2 = j, res3 = k;
                    }
                }
            }
        }
    }
    printf("85%:%d\n75%:%d\n65%:%d\n", res1, res2, res3);
    return 0;
}

L-阶乘之前缀和

简单的前缀和板子,不过vector数组为什么算不对?有懂哥指点一下么,呜呜呜.

参考代码:

#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using i64 = long long;
constexpr int MOD = 998244353, N = 2e6 + 10, inf = 2e9;

template <typename T>
inline void read(T &f) {
    f = 0; T fu = 1; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') { fu = -1; } c = getchar(); }
    while (c >= '0' && c <= '9') { f = (f << 3) + (f << 1) + (c & 15); c = getchar(); }
    f *= fu;
}

i64 a[1050], sum[1050], f[1050], fact[17];

int main() {
    int n, m;
    read(n), read(m);
    for (int i = 1; i <= 15; i++) {
        fact[i] = 1;
    }
    for (int i = 1; i <= 15; i++) {
        for (int j = 1; j <= i; j++) {
            fact[i] *= j;
        }
    }//init
    for (int i = 1; i <= n; i++) {
        read(a[i]);
    }
    for (int i = 1; i <= n; i++) {
        f[i] = fact[a[i]];
    }
    for (int i = 1; i <= n; i++) {
        sum[i] = sum[i - 1] + f[i];
    }
    i64 ans = 0;
    for (int i = 1; i <= m; i++) {
        int l, r;
        read(l), read(r);
        ans += sum[r] - sum[l - 1];
    }
    printf("%lld\n", ans);
    return 0;
}

M-高精度小数求和

注意多余0的处理即可.

参考代码:

#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using i64 = long long;
constexpr int MOD = 998244353, N = 2e6 + 10, inf = 2e9;

std::vector<int> A, B, a, b;
 
std::vector<int> add(std::vector<int> a, std::vector<int> b) {
	std::vector<int> c;
	int t = 0;
	for (int i = 0; i < a.size() || i < b.size(); i++) {
		if (i < a.size()) t += a[i];
		if (i < b.size()) t += b[i];
		c.push_back(t % 10);
		t /= 10;
	}
	if (t) c.push_back(t);
	return c;
}
 
int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
	std::string n, m;
	std::cin >> n >> m;
	bool flag = true;
	for (int i = n.size() - 1; i >= 0; i--) {
		if (n[i] == '.') {
			flag = false; continue;
		}
		if (flag) a.push_back(n[i] - '0');
		else A.push_back(n[i] - '0');
	}
	flag = true;
	for (int i = m.size() - 1; i >= 0; i--)
	{
		if (m[i] == '.') {
			flag = false; continue;
		}
		if (flag) b.push_back(m[i] - '0');
		else B.push_back(m[i] - '0');
	}
 
	while (a.size() != b.size())
	{
		if (a.size() > b.size()) b.insert(b.begin(), 0);
		if (a.size() < b.size()) a.insert(a.begin(), 0);
	}
 
	auto C = add(A, B), c = add(a, b);
 

	if (c.size() > a.size()) {
		std::vector<int> temp;
		temp.push_back(c[c.size() - 1]);
		C = add(C, temp);
		c.erase(c.end() - 1);
	}
 
    while (c.size() > 1 && c.front() == 0) c.erase(c.begin());
 
	for (int i = C.size() - 1; i >= 0; i--) std::cout << C[i];
	std::cout << ".";
	for (int i = c.size() - 1; i >= 0; i--) std::cout << c[i];
	return 0;
}