码迷,mamicode.com
首页 > 其他好文 > 详细

topcoder srm 689 div1 -3

时间:2017-05-29 09:56:43      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:color   ++i   std   size   while   int   包含   --   str   

1、给出一个$2*n$的矩阵,只包含小写字母。重新排列各个元素使得任意两个相邻的元素不相同?

思路:按照每种字符的数量降序排序,然后从多到少依次放每一种。放的时候一上一下交错放置。

#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
#include <assert.h>
using namespace std;


const int N=100005;





class ColorfulGarden
{
public:
    vector<string> rearrange(vector<string> A)
    {
        pair<int,int> a[26];
        for(int i=0;i<26;++i) a[i].first=0,a[i].second=i;
        const int n=(int)A[0].size();
        const string p=A[0];
        const string q=A[1];
        for(int i=0;i<n;++i) ++a[p[i]-‘a‘].first;
        for(int i=0;i<n;++i) ++a[q[i]-‘a‘].first;
        sort(a,a+26);
        reverse(a,a+26);
        vector<string> B;
        if(a[0].first>n) return B;



        vector<char> all;
        for(int i=0;i<26;++i)
        {
            while(a[i].first--) all.push_back(‘a‘+a[i].second);
        }
        char ans[2][55];
        memset(ans,0,sizeof(ans));
        for(int i=0;i<n;++i)
        {
            if(i&1) ans[0][i]=all[i];
            else ans[1][i]=all[i];

        }
        for(int i=n;i<n+n;++i)
        {
            if((i-n)&1) ans[1][i-n]=all[i];
            else ans[0][i-n]=all[i];
        }


        string s1="",s2="";
        for(int i=0;i<n;++i)
        {
            s1+=ans[0][i];
            s2+=ans[1][i];
        }
        B.push_back(s1);
        B.push_back(s2);
        return B;
    }
};

2、构造一个$n*n$的二维数字表$A$,满足:(1)表中所有的数字范围为$[0,n-1]$,(2)$A$的所有‘good‘子集个数恰好为$x$。‘good‘子集的定义为对于从$[0,n-1]$中选出的一个非空子集$T$,任意的$i,j \in T$,那么$A_{i,j} \in T$。

 

topcoder srm 689 div1 -3

标签:color   ++i   std   size   while   int   包含   --   str   

原文地址:http://www.cnblogs.com/jianglangcaijin/p/6917286.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!