本文主要是介绍Codeforces Round #479 (Div. 3) 的 E D,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
*2 /3这个题 (D)
/*
其实可以bfs什么的也可以写的,但是!不枉我昨天体育课一直在想,它是有规律的
规律就是这张图,因为你如果看到的是2的话,2 的很多很多次方都只能由2相乘得来,3 是搞不出来的,3又不能累加到后面去只能除掉,除掉到没有3 只有2的情况,所以排序一下,把3因子多的放在前面,这样才能够完成计算。。不然怎么算-。-以及每个3*3*3 里面再按 2 *3*3*3 3*3*3这样的,不然消除不掉啊。是不是非常简单-。-
应该拿草稿纸写一下... 中间其实想过,但是自己觉得如果3插在中间呢?1 2 3 4 6 12 12/3 又回到4 然后6 8 什么的 开始一个新的世界,其实应该多写一下发现规律,因为8之后再怎么乘2其实都搞不出来任何一个3了。而且只能变大。变小接不上后面的3。数学里面啊,大概因子是个非常神奇的东西吧。
zj还说过路径是唯一的,所以要么*2 要么/3 路径唯一并且元素不会重复 第一个肯定是 3 的因子最多的那个,似乎有几分道理好像我也不是很懂-.-
*/
D好歹还过了-.- 稍微注意一下 这个three的写法(狗头给你打包!)
统计的话怎么不能让n/3呢!觉得不对自己手写模拟一下过程!这就好像是统计数据位数长度一样,这个地方看一下!
#include <iostream>
#include <string>
#include <cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[105];
ll three(ll x)
{ll res = 0;while (x % 3==0) {res++; x /= 3;}return res;}
bool cmp(ll x, ll y) {ll thx = three(x);ll thy = three(y);if (thx == thy)return x < y;//小的排在前面return thx > thy;//thx 大的 排在前面}
int main()
{int n; cin >> n;for (int i = 0; i < n; i++){cin >> a[i];//cout << three(a[i]);}//cout << a[n-1];sort(a, a + n, cmp);for (int i = 0; i < n-1; i++)cout << a[i] << " ";cout << a[n - 1] << endl;return 0;}
====下面是吐槽而不是题解=====(我知道写了没用可是就是忍不住写x...)
写代码要简洁-.- 要简洁-.-如果可以合并其实就没事了0.0,比如昨天写的那个有点像图论的题
其实只要size()==2的时候有用,其他的都是其他情况,然后完全可以只写一个if else(`・ω・´)ゞ(`・ω・´)ゞ写多了又会乱掉
其实也可以并查集写的,只要把那些加了两次的fa设为0,最后看有多少个fa什么的就可以了。
如果用我那种非常朴素的做法,就是如果size是别的 1 3 4 0 .. 就continue掉 如果别的 就以连通的方式搜它一下....
其中我写搜的方式花了点时间...但是感觉很奇妙 感觉像是真的自己在拓展新的东西-.-虽然最后改了几次 还是T了 T 了 认命了哈哈哈还是回去写bfs吧
/* 到40 挑战四分钟写多少字计划 还是及时写下来有用 惊叹号!!!你可以打的很快 那就把这一刻的感受记录一下!!*/
E的代码也扔一下吧,好歹优化了两次-.-还是t dfs可以做 有空补一下dfs的代码(有空才怪...高数什么时候有空写了-.-)
#include<iostream>
#include<algorithm>
#include<set>
#include<string>
#include<vector>
using namespace std;
vector<int> g[200005];
bool visit[200005] = { 0 };int main() {int n;int k; int a;int b;while (cin >> n >> k) {// int z;//n是有几个点!!!! k是有几条Bian!!!for (int i = 1; i <= k; i++) {scanf_s("%d%d", &a, &b);//cin >> a >> b;g[a].push_back(b);g[b].push_back(a);}//bool flag = true;int ans = 0;for (int i = 1; i <= n; i++){if (visit[i] == 1)continue;else if (g[i].size()==2) {bool flag = true;int x;x = i;//初始值int z = 0;int y = g[x][0];//第一个if (g[y].size() == 2) {if (g[y][0] == x)z = g[y][1];else z = g[y][0];}visit[y] = 1;visit[x] = 1;if (g[x].size() != 2)flag = false;if (g[y].size() != 2)flag = false;while(z!=i)//??一个满足了就可以的{if (g[y].size() == 2) {int fa = y;int temp;temp = y;y = z;x = temp;if (g[z].size() == 2) {if (g[z][1] == fa)z = g[z][0];else z = g[z][1];}visit[y] = 1;visit[x] = 1;visit[z] = 1;}if (g[z].size() != 2 || g[x].size() != 2 || g[y].size() != 2){flag = false;break;}}if (flag == true)ans++;
}
else
{visit[i] == 1;continue;
}}cout << ans << endl;}return 0;
}//贴这干啥啊
//啊...纪念一下吧-.-
这篇关于Codeforces Round #479 (Div. 3) 的 E D的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!