本文共 2812 字,大约阅读时间需要 9 分钟。
*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#include #include #include 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#include #include #include #include using namespace std;vector 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;}//贴这干啥啊
//啊...纪念一下吧-.-
转载地址:http://xquti.baihongyu.com/