Atcoder169比赛A至D题题解

3 篇文章 0 订阅
2 篇文章 0 订阅

所有程序在比赛时均AC,至于赛后WA嘛……这个我管不着了(光速逃

感谢b6e0大佬的帮助

我的OJ!(由Vijos提供技术支持)

多好,注册一个号能上两个OJ

A A A

这次的 A A A题就是普普通通的 A A A× B B B问题,没什么特别的。

#include <bits/stdc++.h>
using namespace std;
int main(){
	int a, b;
	cin >> a >> b;
	cout << a*b << endl;
	return 0;
}

B B B

B B B题很坑,切记,一定不能用乘法啊……
把乘法转一下,转成除法,就能完美 A C AC AC

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long n;
	cin >> n;
	long long s[n+1];
	for (int i=1; i<=n; i++){
		cin >> s[i];
		if (s[i]==0){
			cout << 0 << endl;
			return 0;
		}
	}
	for (int i=2; i<=n; i++){
		if(1000000000000000000ll/s[i-1]<s[i]){
			cout << -1 << endl;
			return 0; 
		}
		s[i]*=s[i-1];
	}
	cout << s[n] << endl;
	return 0;
}

C C C

C C C题反而比 B B B题简单~
只需要开long doublelong long就行了。

#include <bits/stdc++.h>
using namespace std;
int main(){
	long long a;
	long double b;
	cin >> a >> b;
	cout << (long long)(a*b) << endl;
	return 0;
}

D D D

有没有发现,我们都到 D D D题了?
是的,这次的 A B C ABC ABC不难,但是很坑……
所以,看上去没什么,实际上我已经 W A WA WA了无数次……
D题也是很简单的代码,不过需要那么一点点的思维。
首先,题目里提到了“质数的次方数”,那么,各位想到了什么?
分!解!质!因!数!
分解完了,各个质因数的个数就是指数对不对?
那么,下面该干啥?
累加,对吧。
但题目里又说了,各个数不能重复加。
那么,就直接看指数。让指数分别为 1 1 1 2 2 2 3 3 3……这样,就能做到各个数不相同。
最后,累加!
看着轻松,码量也不大,但要能想到这个也不简单呢!
满怀期待地提交,得, T L E TLE TLE
哪里错了呢?原来,分解质因数时只能分解到 n \sqrt{n} n ,不然就会超时。
那么,万一 n n n是质数呢?
为了避免这种尴尬,我们就得判断。
如果到最后, n n n不为 0 0 0,就说明 n n n为质数,那么,还可以再进行一次运算。
如果 n n n就等于 0 0 0,那么,就说明 n n n不能再继续操作了,直接输出。
最后,终于 A C AC AC了!

#include <bits/stdc++.h>
using namespace std;
int cal(int x){
	int j=1;
	while (x-j>=0){
		x-=j;
		j++;
	}
	return j-1;
}
int main(){
	long long n;
	cin >> n;
	int m=int(sqrt(n));
	int a[m+1];
	for (int i=1; i<=m; i++) a[i]=0;
	while (n%2==0){
		n/=2;
		a[2]++;
	}
	int t=3, ans=0;
	while (n!=1&&t<=m){
		while (n%t==0){
			n/=t;
			a[t]++;
		}
		t+=2;
	}
	for (int i=1; i<=m; i++)
		if (a[i]!=0) ans+=cal(a[i]);
	if (n==1) cout << ans << endl;
	else cout << ans+1 << endl;
	return 0;
}

至于 E E E题和 F F F题嘛……实力太弱,不要吐槽啊……
辛辛苦苦写了那么多,点个赞再走嘛~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很高兴为您提供 Mathor Cup 2022 D 的解思路。 目描述: 给定一个 $n\times n$ 的矩阵 $A$,其中 $A_{i,j}\in\{0,1\}$。你可以进行任意次以下操作: 1. 将第 $i$ 行取反(即 $A_{i,j}\rightarrow 1-A_{i,j}$); 2. 将第 $j$ 列取反(即 $A_{i,j}\rightarrow 1-A_{i,j}$)。 请你计算通过若干次操作后,能够使得矩阵 $A$ 的每一行和每一列的 $1$ 的个数相等的最小操作次数。 解思路: 本可以使用贪心和二分图匹配的思想来解决。具体步骤如下: 1. 统计每一行和每一列的 $1$ 的个数,设 $row_i$ 表示第 $i$ 行的 $1$ 的个数,$col_j$ 表示第 $j$ 列的 $1$ 的个数。 2. 如果每一行和每一列的 $1$ 的个数都相等,那么无需进行任何操作,直接输出 $0$。 3. 如果某一行 $i$ 的 $1$ 的个数多于其他行的 $1$ 的个数,那么可以将该行取反,将 $row_i$ 减一,将 $col_j$ 加一。 4. 如果某一列 $j$ 的 $1$ 的个数多于其他列的 $1$ 的个数,那么可以将该列取反,将 $col_j$ 减一,将 $row_i$ 加一。 5. 重复步骤 3 和步骤 4,直到每一行和每一列的 $1$ 的个数都相等。 6. 计算进行的操作次数,输出结果。 需要注意的是,为了避免重复计算,我们可以使用二分图匹配的思想来进行操作。将每一行和每一列看做二分图的两个部分,如果某一行 $i$ 的 $1$ 的个数多于其他行的 $1$ 的个数,那么可以将第 $i$ 行和所有 $1$ 的个数比该行少的列建立一条边;如果某一列 $j$ 的 $1$ 的个数多于其他列的 $1$ 的个数,那么可以将第 $j$ 列和所有 $1$ 的个数比该列少的行建立一条边。最后,将二分图的最小路径覆盖数乘以 $2$ 就是最小操作次数。 时间复杂度:$O(n^3)$。 完整代码:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值