码迷,mamicode.com
首页 > 编程语言 > 详细

Codeforces Round #297 (Div. 2)(模拟+字符串+排序)

时间:2015-03-30 11:28:29      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:模拟   字符串   排序   

A.

题目链接:点击打开链接


解题思路:

大意就是说奇数位给小写字母,偶数位给大写字母,然后小写对应钥匙,大写对应门,问最少消耗几把钥匙能打开所有门。

简单模拟即可,初始化一个英文字母数组,如果遇到小写字母,我们把相应的计数器++,遇到大写,如果它对应的数组值不为0,那么我们将其--,

否则购买一把钥匙。


完整代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <set>
#include <vector>
#include <climits>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn = 500001;
int n;
string s;
int vis[26];

int main()
{

    #ifdef DoubleQ
    freopen("in.txt" , "r" , stdin);
    #endif
    while(cin >> n)
    {
        memset(vis , 0 , sizeof(vis));
        cin >> s;
        int len = s.length();
        int cnt = 0;
        for(int i = 0 ; i < len ; i ++)
        {
            if((i+1) % 2 != 0)
            {
                vis[s[i] - 'a'] ++;
            }
            else
            {
                if(vis[s[i] - 'A'])
                {
                    vis[s[i] - 'A'] --;
                }
                else
                {
                    cnt ++;
                }
            }
        }
        cout << cnt << endl;
    }
    return 0;
}


B.

题目链接:点击打开链接


解题思路:

感觉智商又压制住了。。。明显暴力的O(m^2)会超时,我还是侥幸的试了试。。。果然TLE。

正解是开一个sum数组记录每个位置出现的反转次数,然后从0~len / 2去检查sum数组,设 k = 0,每次k += sum[i] ,如果k是奇数的话,那么就交换s[i]和s[len - i - 1]。这样求解是正确的,虽然没怎么太想明白。不过至少有一点是明确的,就是一个区间的字符串反转偶数次的话,那相当于没反转,所以只要考虑那些反转奇数次的即可。


完整代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <complex>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
using namespace std;
typedef long long LL;
const int MOD = int(1e9)+7;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-9;
const double PI = acos(-1.0); //M_PI;
const int maxn = 200001;
string s;
int n;
int sum[maxn];
int main()
{
    #ifdef DoubleQ
    freopen("in.txt","r",stdin);
    #endif
    while(cin >> s)
    {
        cin >> n;
        int key;
        int len = s.length();
        memset(sum , 0 , sizeof(sum));
        for(int i = 0 ; i < n ; i ++)
        {
            cin >> key;
            sum[key - 1] ++;
        }
        int k = 0;
        for(int i = 0 ; i < len / 2 ; i ++)
        {
            k += sum[i];
            if(k % 2 != 0)
            {
                swap(s[i] , s[len - i - 1]);
            }
        }
        cout << s << endl;
    }
    return 0;
}


C.

题目链接:点击打开链接


解题思路:

这场的C题感觉比B题简单,读完题第一个想法就是排个序,然后相邻比较下,再做和。唯一可能出问题的是数据太大,担心long long 存不下,于是开成unsigned long long。

可是这道题还有一个坑,那就是不一定要相邻的两个比较,因为照这个思路每个矩形是相邻四个数值构成的,写成i -= 2意味着当两对其中之一不成立时,另一对相当于被我们舍弃,这样最终得到的一定不是最大解,所以要写成i--,若满足条件,我们再i--。


完整代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <complex>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
using namespace std;
typedef unsigned long long LL;
const int MOD = int(1e9)+7;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-9;
const double PI = acos(-1.0); //M_PI;
const int maxn = 2000001;
int n;

LL s[maxn];

bool cmp(LL a , LL b)
{
    return a < b;
}

LL min(LL a , LL b)
{
    return a < b ? a : b;
}

int main()
{
    #ifdef DoubleQ
    freopen("in.txt","r",stdin);
    #endif
    while(cin >> n)
    {
        memset(s , 0 , sizeof(s));
        for(int i = 0 ; i < n ; i ++)
        {
            cin >> s[i];
        }
        sort(s , s + n , cmp);
        LL sum = 0;
        LL flag = -1;
        for(int i = n - 1 ; i >= 0 ; i --)
        {
            if( s[i] - s[i-1] <= 1)
            {
                LL k = s[i-1];
                if(flag == -1)
                {
                    flag = k;
                }
                else
                {
                    sum += k * flag;
                    flag = -1;
                }
                i --;
            }
            //cout << sum << endl;
        }
        cout << sum << endl;
    }
    return 0;
}


Codeforces Round #297 (Div. 2)(模拟+字符串+排序)

标签:模拟   字符串   排序   

原文地址:http://blog.csdn.net/u013447865/article/details/44745625

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