哈尔滨理工大学软件与微电子学院程序设计竞赛 总结

题目链接:
传送门

A 抗疫必胜1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int t, n, k;

int main() {
	printf("V     V\n");
	printf(" V   V\n");
	printf("  V V\n");
	printf("   V \n");
}

直接输出即可

B 疫情死亡率

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

double n, m;

int main() {
	scanf("%lf%lf", &n, &m);
	printf("%.3lf\%\n", m / (n) * 100);
}

根据定义直接除即可

C 整除判断

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int n, m;

int main() {
	scanf("%d%d", &n, &m);
    if(n % m == 0) puts("YES");
    else puts("NO");
}

直接求余即可

D 编程时间

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int h1, h2, m1, m2;

int main() {
	scanf("%d%d%d%d", &h1, &m1,&h2, &m2);
	int ans = (h2 - h1) * 60 + (m2 - m1);
	printf("%d %d\n", ans / 60, ans % 60);
}

做差输出时间

E 双位彩

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int n, m;

int main() {
	scanf("%d%d", &n, &m);
	if(n == m) puts("100");
	else if(n / 10 == m % 10 && n % 10 == m / 10) puts("20");
	else if(n / 10 == m % 10 || n % 10 == m / 10 || n / 10 == m / 10 || n % 10 == m % 10) puts("2");
	else puts("0");
}

根据题意分情况讨论

F 抗疫必胜2

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int n, m;

int main() {
	scanf("%d%d", &n);
    while(n--) {
        puts("China will win the battle against COVID-19.");
    }
}

按要求输出即可

G 成绩统计

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

double n, tmp, mx, mn = 1e7, sum;

int main() {
	scanf("%lf", &n);
    for(int i = 0; i < n ; i++) {
        scanf("%lf", &tmp);
        mx = max(tmp, mx);
        mn = min(tmp, mn);
        sum += tmp;
    }
    printf("%.2lf %.0lf %.0lf\n", sum / n, mx, mn);
}

维护最大最小值和总和,最后输出即可

H 抗疫必胜3

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int n, m;

int main() {
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < 2 * n; j++) {
			if(j == i || j == 2 * n - i - 2) printf("V");
			else printf(" ");
		}
		printf("\n");
	}
}

根据题意输出即可

I 统计数据

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int n, cnt[N], mx, tmp;

int main() {
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &tmp);
		mx = max(tmp, mx);
		cnt[tmp]++;
	}
	for(int i = mx; i > 0; i--) {
		if(cnt[i])
			printf("%d-%d\n", i, cnt[i]);
	}
}

用一个数组统计数据个数,同时维护最大值的大小然后从最大值往下又出现就输出,没出现就跳过

J 子序列求和

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

int p, q, t, n, sum[N], mx, tmp;

int main() {
	scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &tmp);
        sum[i] = sum[i - 1] + tmp;
    }
    scanf("%d", &t);
    while(t--) {
        scanf("%d%d", &p, &q);
        if(n < p && p <= q) puts("0");
        else printf("%d\n", sum[min(n, q)] - sum[p - 1]);
    }
}

这道题可以用前缀和维护,然后根据题意输出即可

K Simple Question

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 200010;

ll n, m, k, tmp;

ll gcd(ll a, ll b) {
    return !b ? a : gcd(b, a % b);
}

int main() {
	scanf("%lld%lld%lld", &n, &m, &k);
    ll mul = (n * m) / gcd(n, m);
	if(mul > k) {
        printf("-1\n");
    }
	else {
		tmp = k % mul;
		printf("%lld\n", k - tmp);
	}
}

求最小公倍数,然后求余得到的值减去原来的k即为答案。

L Wrong Word

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 26;

string str;
int le[26], n;

int f(int n) {
	int tmp = 1;
	for(int i = 1; i <= n; i++) {
		tmp *= i;
	}
	return tmp;
}

int main() {
	cin >> str;
    n = str.size();
	for(int i = 0; i <= n; i++) {
		le[str[i] - 'A']++;
	}
	int ans = f(n);
	for(int i = 0; i < 26; i++) {
		if(le[i]) {
			ans /= f(le[i]);
		}
	}
	printf("%d\n", ans - 1);
}

排列组合,全排列去重,最后减去本身即为答案。

M Mutable Array

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 26;

ll mn, mx, n;

int main() {
	scanf("%lld%lld%lld", &n, &mn, &mx);
	if(mn == mx) puts("1");
	else {
		ll ex = (mx - mn) * (n - 2);
		ll ans = 1 + ex;
		printf("%lld\n", ans);
	}
}

找到和可能的最大值和最小值,然后做差 + 1即为答案。

N Interesting Number

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const int N = 1000010;
bool isprime[N];
ll prime[N], x, n;
void oulashai()
{
	for (ll i = 2; i <= N; i++)
	{
		if (!isprime[i]) prime[x++] = i;
		for (ll j = 0; j < x; j++)
		{
			if (i * prime[j] > N) break;
			isprime[i * prime[j]] = true;
			if (i % prime[j] == 0) break;
		}
	}
}

int main() {
    oulashai();
	scanf("%lld", &n);
    ll ans = 0;
    while (ans <= x && prime[ans] * prime[ans] <= n) ans++;
    printf("%lld\n", ans);
}

欧拉筛找出所有的质数,然后找出小于等于n的素数的平方的个数

O Find Difference

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

ll n;

int main() {
    scanf("%lld", &n);
    printf("%lld\n", n == 1 ? 0 : 1);
}

这道题比较神奇,我们可以把所有堆经行编号,每堆抽取与当前编号数字相等个硬币,合在一起称,正常情况下这堆硬币的重量是(1 + n) * n / 2,如果此时某堆的质量为2,那么总和就会多出k的重量,而这个重量即为那一堆的编号。

P Dismantling Number

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>
#define ll long long
using namespace std;

ll n;

int main(){
    scanf("%lld", &n);
	for(int i = 1; i < 30; i++){
		for(int j = i; j < 30; j++){
			for(int k = j; k < 30; k++){
				if(((1 << i) + (1 << j) + (1 << k)) == n){
					puts("YES");
					return 0;
				}
			}
		}
	}
	puts("NO");
} 

这道题暴力枚举即可

Q Finite Decimal

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

int n, tmp;

bool judge(int n) {
    if(n == 1) return 1;
    else if(n % 2 == 0) return judge(n / 2);
    else if(n % 5 == 0) return judge(n / 5);
    else return 0;
}

int main() {
	scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf("%d", &tmp);
        if(judge(tmp)) puts("YES");
        else puts("NO");
    }
}

判断一下当前数字的因子是否只包含2和5即可

R Take Apples

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;

ll n, tar;

int main() {
	scanf("%lld", &n);
    for(int i = 0; i < n; i++) {
        ll sum = 0;
        scanf("%lld", &tar);
        for(ll i = 2; sum < tar; i++) {
            sum += i;
        }
        if(sum == tar) puts("YES");
        else puts("NO");
    }
}

这道题目类似于巴什博弈,但是每轮的拿法有所不同,所以只要当前数是由2到k(k为任意大于2的数)的和,那么这个局面下就可以胜利。

S Calculate Sum

T Calculate Area

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值