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 }