Codeforces 479【D】div3

题目链接:http://codeforces.com/problemset/problem/977/D

题意:给你一个数字序列,定了一个游戏规则。你可以对当前数字进行两个操作

1、/ 3  如果这个数字能被3整除

2、* 2

你就是要组成一个新的序列,使得这个游戏规则能够成立。

题解:这个规律是猜的。因为题目保证有解,所以能整除3的肯定都会先放在前面。所以排序的时候整除3的放前面,在整除3的这一部分,大的肯定要放在后面啊。因为不放在后面的话就不能构成*2的条件了嘛。QWQ瞎搞瞎搞。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #define ll long long
 5 #define Max 105 
 6 using namespace std;
 7 
 8 
 9 int n;
10 struct node{
11     ll val;
12     ll count;
13 };
14 
15 node num[Max + 5];
16 
17 bool cmp(node x,node y){
18     if(x.count == y.count){
19         return x.val < y.val;
20     }
21     else{
22         return x.count > y.count;
23     }
24 }
25 
26 int div(ll x){
27     int cnt = 0;
28     while(x % 3 == 0){
29         x /= 3;
30         cnt++;
31     }
32     return cnt;
33 }
34 
35 
36 int main(){
37     scanf("%d",&n);
38     for(int i = 0; i < n; i++){
39         scanf("%lld",&num[i].val);
40         num[i].count = div(num[i].val);
41 
42     }
43     sort(num,num+n,cmp);
44 
45     for(int i = 0 ; i < n; i++)
46         printf("%lld ",num[i].val);
47 }
View Code
原文地址:https://www.cnblogs.com/Asumi/p/9005736.html