[TC]SRM615 div1 250 AmebaDiv1

题意:给你一个变形虫,初始大小未知,在一定时间顺序内它会遇到n个凝胶,如果这个凝胶大小和他大小一样,他的大小加倍。问你最后变形虫不可能的大小有多少个。

解题思路:只有在n个凝胶大小出现过的值才会变,找出变化的即可 (做的慢掉分了)

解题代码:

// BEGIN CUT HERE
/*

*/
// END CUT HERE
#line 7 "AmebaDiv1.cpp"
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <fstream>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <list>
#include <stdexcept>
#include <functional>
#include <utility>
#include <ctime>
using namespace std;

#define PB push_back
#define MP make_pair

#define REP(i,n) for(i=0;i<(n);++i)
#define FOR(i,l,h) for(i=(l);i<=(h);++i)
#define FORD(i,h,l) for(i=(h);i>=(l);--i)

typedef vector<int> VI;
typedef vector<string> VS;
typedef vector<double> VD;
typedef long long LL;
typedef pair<int,int> PII;
 struct node{
            long long x; int y ; 
 }a[300];

int cmp1(const void *a ,const void *b)
{
    if((*(node*) a).x == (*(node *)b).x)
      return(*(node*) a).y - (*(node *)b).y;
    return(*(node*) a).x - (*(node *)b).x;
}
class AmebaDiv1
{
        public:
        int count(vector <int> X)
        {
           int n = X.size();
           for(int i = 0 ;i < n;i ++)
           {
              long long ans = X[i];
              for(int j = 0 ;j < n ;j ++)
                  if(X[j] == ans)
                      ans *= 2 ;
              a[i].x = ans;
              a[i].y = X[i] ; 
           }
           qsort(a,n,sizeof(node),cmp1);
           node b[1000];
           int bnum = 1; 
           b[1].x = a[0].x;
           b[1].y = a[0].y;
           for(int i =1; i< n;i ++)
           {
              if(a[i].x != a[i-1].x || a[i].y != a[i-1].y  )
                {
                  bnum ++ ; 
                  b[bnum].x = a[i].x;
                  b[bnum].y = a[i].y;
                }           
           }
           int sum = 0 ;
           for(int i = 1;i <= bnum;i ++)
               for(int j = 0 ; j < n ;j ++)
               {
                 if(i >= 2 && b[i].x == b[i-1].x)
                     break;
                 if(b[i].x == X[j])
                 {
                  sum ++ ;
                  break;;
                 }
               }
    
           return bnum-sum + tsum ;
        }
        

};
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3646233.html