`
king_tt
  • 浏览: 2100148 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Codeforces Round #155 (Div. 2)

 
阅读更多

这场做得很不理想,首先自己的读题速度还是很慢,然后就是调试时暴露的问题,做C题时自己的算法思路没问题,但是可能由于自己不够自信,一直往算法思路上想,结果结果结束后发现,是因为粗心导致两条语句的顺序写错了....


A. Cards with Numbers

题目大意:给2n个数,然后输出n对数,每对数都是相等的.

思路:每个数的范围是1~5000,所以只需要开一个5001的数组记录每个数字出现的次数,如果有一个的次数是奇数,说明是不可能的。然后排序一下,按顺序输出位置即可。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i,n) for(int i=0; i<(n); ++i)
#define FOR(i, s, n) for(int i=s; i<(n); ++i)
using namespace std;

const int MAXN = 3000005;
int n, m, k;
int cnt[5200];

struct node{
    int x;
    int index;
    friend bool operator<(const node&a,const node&b){
        return a.x < b.x;
    }
}arr[MAXN*2];

bool ok(){
    FOR(i, 1, 5001){
        if(cnt[i]%2==1)return false;
    }
    return true;
}

int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    while(~scanf("%d", &n)){
        memset(cnt, 0, sizeof(cnt));
         
        FOR(i,1,2*n+1){
            scanf("%d",&arr[i].x);
            arr[i].index=i;
            ++cnt[arr[i].x];
        }
        if(!ok()){
            puts("-1");
            continue;
        }
        sort(arr+1, arr+2*n+1);
        for(int i=1; i<=2*n; i+=2){
            printf("%d %d\n", arr[i].index, arr[i+1].index);
        }
    }
    return 0;
}


B. Jury Size

题目大意:有n个奥运会要举办,每个奥运会都在一个m月d日开始,而且这个奥运会需要p个人,用t天来准备。准备的时间必须在m月d日的前一天刚好准备好。同一个人一次同时准备一场,求最少需要雇佣多少个人,使得所有奥运会都能恰好准备完。

思路:把日期转换成当年的第几天,例如1月10日,就是2013年的第10天。但是有可能要从2012年就开始准备了。所以可以在原来基础上再加一个数(大于100即可)。然后,由于数据量很少,我们可以暴力,算出每一天需要的人数,取其中人数最多的那一天,就是所需答案。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define REP(i,n) for(int i=0; i<(n); ++i)
#define FOR(i, s, n) for(int i=s; i<(n); ++i)
using namespace std;

const int MAXN = 1005;
const int ADD = 400;
int n, m, k;

int nn[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int month[13];
int cnt[1000];

int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int m,d,p,t;
    month[0] = 0;
    for(int i=1; i<=12; ++i)
        month[i] = month[i-1]+nn[i];
    while(~scanf("%d", &n)){
        memset(cnt,0,sizeof(cnt));
        REP(i, n){
            scanf("%d%d%d%d",&m,&d,&p,&t);
            int now=month[m-1]+d+ADD;
            int beg = now-t, end = now-1;
            for(int i=beg; i<=end; ++i)
                cnt[i] += p;
        }
        int maxx=-1;
        REP(i, 1000)if(cnt[i]>maxx)maxx=cnt[i];
        printf("%d\n", maxx);
    }
    return 0;
}


C. Anagram

题目大意:有两个字符串s和t,可以改变s中的字符,求最少需要改变s中的几个字符,使得s和t上的每种字符数量都相等,并且s中改变的位置,使得改变后s的字典序最小。

思路:先分别计算出s和t中的每种字符出现的次数,并分别记录在cnt1, cnt2数组中。然后通过观察可以发现,对于字符ch,如果cnt1[ch] < cnt2[ch],那么肯定是要添加cnt2[ch]-cnt1[ch]个ch字符。那么在让s中的哪些字符是要变换成t中的ch呢? 对于任意ch,如果cnt1[ch] > cnt2[ch], 即s中的ch字符数量多了,那么就要把cnt1[ch]-cnt2[ch]个ch字符改变成所需的t中的字符。

再然后,就是改变字符的位置问题,需要按照贪心的思路。把要改变的字符放在按从小到大顺序放入s中要改变的位置(这个位置也从左到右放置),如果当前要放置的是ch,位置是s[i], 会有两种情况:(1) s[i] > ch, 那么只要直接把ch赋给s[i], 就可以是s的字典序变小。 (2)s[i] < ch, 由于把ch赋给s[i]会使原来的字典序变大,所以要让s[i]这个要改变的尽量往后面放。 例如,s为 AEDEDE, 这三个E中有两个要改变成G,那么就要选择后面两个D变成G。


代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<functional>
#include<set>
#define REP(i,n) for(int i=0; i<(n); ++i)
#define FOR(i, s, n) for(int i=(s); i<(n); ++i)
using namespace std;

const int MAXN = 1000005;
int n, m, k;
char s[MAXN], t[MAXN];
int cnt1[200], cnt2[200], re[200];

int main(){
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    while(~scanf("%s%s", s,t)){
        int len=strlen(s);
        memset(cnt1, 0, sizeof(cnt1));
        memset(cnt2, 0, sizeof(cnt2));
        memset(re, 0, sizeof(re));
        REP(i, len){
            ++cnt1[s[i]];
            ++cnt2[t[i]];
        }
        priority_queue<char,vector<char>,greater<char> >Q;
        int cnt=0;
        for(int i='A'; i<='Z'; ++i){
            if(cnt1[i] > cnt2[i]){
                re[i] = cnt1[i]-cnt2[i];
            }
            else if(cnt1[i] < cnt2[i]){
                for(int j=0; j<cnt2[i]-cnt1[i]; ++j){
                    ++cnt;
                    Q.push(char(i));
                }
            }
        }
        int vis[200];
        memset(vis, 0, sizeof(vis));
        REP(i, len)if(re[s[i]] > 0 && !Q.empty()){
            char ch=Q.top();
            ++vis[s[i]];
            if(s[i] > ch || vis[s[i]]+re[s[i]]-1==cnt1[s[i]]){
                --re[s[i]];
                s[i] = ch;
                Q.pop();
            }
        }
        printf("%d\n", cnt);
        puts(s);
    }
    return 0;
}



E. Dormitory


D. Rats



原创http://blog.csdn.net/shuangde800 (转载请标明)


分享到:
评论

相关推荐

    Codeforces Round #723 (Div. 2).md

    Codeforces Round #723 (Div. 2).md

    Codeforces Round #630 (Div. 2) D. Walk on Matrix(构造)

    上面代码跑出来的dp[n][m]是0,然后从(1,1)(1,2)(2,2)(2,3)这样的相与值是k (看懂ans+k是啥应该就懂了) 代码: int main() { std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); int ans=(1&...

    Codeforces Round #627 (Div. 3) C. Frog Jumps(思维)

    传送门 题意: 开始位置在0,问能否跳到n+1位置 每步只能跳d 在1——n每个位置有方向,L,R,求d的最小值 思路: 只用找相邻两个R之间的最大值即可 代码: #include #include ...typedef long long l

    Codeforces Round #627 (Div. 3) B. Yet Another Palindrome Problem

    就是把所有相等的数放到一个vector里,如果他出现大于2次,看最远的间距是否大于2即可,找到一个就可以 代码: #include #include #include #include #include #include #include #include #include #include #...

    Codeforces Round #629 (Div. 3) B. K-th Beautiful String

    长度为n的字符串包含n−2n−2n−2个aaa和222个bbb,求按照字典序排列输出第kkk个字符串 解题思路 第一个bbb在倒数第二位有1个字符串,在倒数第三位有2个字符串…在倒数第nnn位时有n−1n-1n−1个字符串 可以根据第一...

    Codeforces Round #479 (Div. 3) E. Cyclic Components

    E. Cyclic Components 题目链接-E. Cyclic Components 题目大意 给你nnn个点和mmm条边,求所构成图中单圈环的个数 ...并查集并查集并查集 很明显单圈环每个点的度都为222,所以我们可以用数组cnt[]记录每个点的度,...

    Codeforces Round #629 (Div. 3) E.Tree Queries (DFS)

    Codeforces Round #629 (Div. 3) E.Tree Queries (DFS) 思路:若ai 在路径上 ,则ai的父结点一定在路径上,若ai是路径上某个结点的子结点,则ai的父结点一定在路径上,综上只需考虑ai的父节点就行了。对每个ai判断...

    Codeforces Round #628 (Div. 2)

    给两两节点放一个数字(0~n-2 唯一) 给你一棵树,求所有任意两节点相连的路以外的路上的数字的最小值最小 思路 构造 若一个点连了三条边及以上,则这个点的边从最小值开始赋值。其他边从最大点开始赋值。 证明:一...

    Codeforces Round #627 (Div. 3) A. Yet Another Tetris Problem

    给一个长度为n的数组,两种操作,一个是把任意一个ai变成ai+2a_i变成a_i+2ai​变成ai​+2,另一个是如果所有数都大于0,可以把所有数减1,问通过这些操作能否把所有数变为0 思路: 如果任意两个数之差为奇数,那么就...

    Codeforces Round #620 (Div. 2) Longest Palindrome

    B. Longest Palindrome time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output Returning back to problem solving, Gildong is now studying about ...

    Codeforces Round #628 (Div. 2) A. EhAb AnD gCd

    输入一个正整数x,找出这样的2个正整数a和b,使得gcd(a,b)+lcm(a,b)=x 解题思路 找最特殊的情况a=1,b=x-1即可 这样a,b两个数最大公因数为1,最小公倍数x-1,满足题意√ 附上代码 #include #define int long long #...

    Codeforces Round #618 (Div. 2) C. Anu Has a Function(进制,位运算,贪心)

    将所有数字看成2进制,从最高位看起,如果第i位上为1的数只有一个的话,那么这个数必然对答案有贡献,就把它排在第一个,后面任意排。 例:11,6,4,0 二进制表示为:1011,110,100,0 右起第四位为1的只有1011,...

    Codeforces Round #635 (Div. 2)D. Xenia and Colorful Gems

    传说门 刚好今晚是中国场! 其实这道题比较水,但当时思路错,一心想着化简公式,浪费了好多时间a....#pragma GCC optimize(2) #include #define ll long long #define endl '\n' using namespace std; const int manx=

    Codeforces Round #633 (Div. 2) A. Filling Diamonds(找规律)

    传送门 题意: 找规律,题意就是有多少种方式填充该图形 画两个就发现,输出n即可 代码: #include #include #include #include #include #include #include #include ...#define SZ(x) ((int)(x)

    Educational Codeforces Round 83 (Rated for Div. 2) D

    C(n-2,i-1)*C(j-1,n-2)*(i-1) __ j: n-1 -&gt; m 我们发现内层循环,每次只是j加一,我们就可以只用一次组合数剩下的用差量表示 对于外层循环同理 只有(i-1) * C(n-2,i-1) i会每次加一。我们也只算一次剩下的用差量...

    Codeforces Round #628 (Div. 2) A~~D

    A #include using namespace std; typedef long long ll; int main(){ int t; cin&gt;&gt;t; while(t--){ ll x; cin&gt;&gt;x; cout&lt;&lt;1&gt;&gt;t; while(t--){ st.clear(); ll n; cin &gt;&gt;n;... ll re

    【Codeforces Round#620 (Div. 2)】B. Longest Palindrome 题解

    题目链接:B. Longest Palindrome 题目 Returning back to problem solving, Gildong is now studying about palindromes. He learned that a palindrome is a string that is the same as its reverse....

    Codeforces Round #629 (Div. 3) E – Tree Queries dfs序判祖先关系

    惭愧,前几天刚学的dfs序判祖先关系都忘了用。。 这题我们先把所有点都变成父亲节点(根节点不变),这样只需要判所有节点是否在一条链上。 由于判断x是y的祖先:需要满足:st[x]&lt;...const int M = 2e5+

Global site tag (gtag.js) - Google Analytics