codeforces_#243 (Div.2)

A题,426A,Sereja and Mugs

题目意思:有n-1个小伙伴,n个杯子,里面分别装有水,每个小伙伴可以选择一杯水,问总共加起来会不会超过给的S

解题思路:

这个还要说吗?

/*************************************************************************
	> File Name: 1.cpp
	> Author: boblee
	> Mail: [email protected]
	> Created Time: 2014年04月28日 星期一 19时16分09秒
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=100+20;

int mug[maxn];
int n,s;
int main()
{
    while(~scanf("%d%d",&n,&s))
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&mug[i]);
        sort(mug+1,mug+1+n);
        int sum = 0;

        int i;
        for(i=1;i<n;i++)
        {
            sum+=mug[i];
            if(sum > s)
                break;
        }

        if(i<n)
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

B,426B,Sereja and
Mirroring

题目意思:给你一个矩阵a,如果是严格对称的,必须是偶对称,就消去下半部分,问最后剩多少部分

解题思路:

每次就模拟,可以就消去,不可以就退出输出

/*************************************************************************
	> File Name: 2.cpp
	> Author: boblee
	> Mail: [email protected]
	> Created Time: 2014年04月28日 星期一 19时35分20秒
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;

const int maxn=100+20;

string s[maxn];
char s2[10*maxn];
int n,m;

bool check(int x)
{
    if(x&1)
        return false;
    for(int i=1,j=x;i<j;i++,j--)
    {
        if(s[i]!=s[j])
            return false;
    }
    return true;
}

int main()
{
    while(~scanf("%d%d\n",&n,&m))
    {

        for(int i=1;i<=n;i++)
        {
            gets(s2);
            s[i] = string(s2);
        }
        if(n&1)
            printf("%d\n",n);
        else
        {
            bool flag = check(n);
            while(n%2==0 && flag)
            {
                n = n/2;
                flag = check(n);
            }
            printf("%d\n",n);
        }
    }
    return 0;
}

C,425A,Sereja and
Swaps

题目意思:给n个数,你最多可以交换k次,问最后的最大连续和

解题思路:

因为n很小,可以暴力枚举,但是枚举也是有艺术的,我开始完全不知道怎么枚举。

就是枚举区间,然后只能用区间外的去交换区间里面的,最后找出最大的那一个

/*************************************************************************
	> File Name: 3.cpp
	> Author: boblee
	> Mail: [email protected]
	> Created Time: 2014年04月28日 星期一 20时59分51秒
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

const int maxn=200+20;
int a[maxn];
int sum[maxn];
bool vis[maxn];
int n,k;
const int INF = 0X3F3F3F3F;

int cal(int l,int r)
{
    priority_queue<int,vector<int>,greater<int> > q;
    int ret = 0;
    memset(vis,false,sizeof(vis));
    for(int i=l;i<=r;i++)
    {
        ret += a[i];
        q.push(a[i]);
    }

    int ktmp = k;
    while(ktmp > 0)
    {
        int maxt = -INF;
        int maxv;
        for(int i=1;i<=n;i++)
        {
            if((i>=l && i<=r) || vis[i]) continue;
            if(a[i] > maxt)
            {
                maxt = a[i];
                maxv = i;
            }
        }

        if(maxt > q.top())
        {
            ret = ret-q.top()+maxt;
            vis[maxv] = true;
            q.pop();
            q.push(maxt);
        }
        ktmp--;
    }
    return ret;
}

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            sum[i] = sum[i-1]+a[i];
        }

        int ans = -INF;
        for(int i=1;i<=n;i++)
        {
            for(int j=i;j<=n;j++)
            {
                int tmp = cal(i,j);
                if(tmp > ans)
                    ans = tmp;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

codeforces_#243 (Div.2),码迷,mamicode.com

时间: 2024-10-17 13:40:30

codeforces_#243 (Div.2)的相关文章

Codeforces Round #243 (Div. 1)——Sereja and Two Sequences

题目链接 题意:给两个长度分别为n和m的序列,现在有两种操作:1.分别选择两个序列的一个非空前缀,切两个前缀的最后一位相同,删除之,得到1分(只累计),消耗e:2.直接删除两个序列,消耗值定于两个序列之前删除的元素个数之和,并且使得得到的分有效(之前没有有效分) 分析: 首先,问题其实就是转化成,进行若干次操作1,然后进行操作2 还要找到一个判别标准,来评判较优的状态(贪心) 每次的消耗值比较大,其实可以计算出最大的删除次数,这个值不是很大 状态表示: 简单的,一个状态可以表示为串A的位置.串B

Codeforces Round #243 (Div. 2) A. Sereja and Mugs

#include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; int main(){ int n,s; cin >> n >> s; vector<int> a(n); for(int i = 0 ; i < n ; ++ i) cin >> a[i]; sort(a.b

Codeforces Round #243 (Div. 2) B. Sereja and Mirroring

#include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n,m; cin >> n >> m; vector<vector<int> > a(n,vector<int>(m,0)); for(int i = 0; i < n; ++ i){ for(int j = 0 ;

Codeforces Round #243 (Div. 2) C. Sereja and Swaps

思路来源:http://blog.csdn.net/sf____/article/details/24626739 题目给出数据上限为200, 所以可以暴利所有区间. 解题思路: for i in range(n): for j in range(n): create priority_queue for w in range(k): if(Max.top > Min.top) SWAP(Max[element], Min[element]) 暴利枚举所有初始区间 [ i , j ] ,则剩下的

Codeforces Round #243 (Div. 2) C. Sereja and Swaps(优先队列 暴力)

题目 题意:求任意连续序列的最大值,这个连续序列可以和其他的 值交换k次,求最大值 思路:暴力枚举所有的连续序列.没做对是因为 首先没有认真读题,没看清交换,然后,以为是dp或者贪心 用了一下贪心,各种bug不对. 这次用了一下优先队列,以前用的不多,看这个博客又学了一下 AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #i

Codeforces Round #243 (Div. 1)

---恢复内容开始--- A 枚举l,r 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 #include<cmath> 8 #include<queue> 9 #include<set> 10 us

Codeforces Round #243 (Div. 1) A题

http://codeforces.com/contest/425/problem/A 题目链接: 然后拿出这道题目是很多人不会分析题目,被题目吓坏了,其中包括我自己,想出复杂度,一下就出了啊!真是弱! 直接暴力求出矩阵数值,然后枚举每一个[I,J];再O[N]判断,分配好在[I,J]区间的数和之内的数,再排序下SOLO了 CODE:#include <cstdio> #include <cstring>#include <queue>#include <vect

Codeforces Round #243 (Div. 1)-A,B,C-D

这场CF真是逗了... 因为早上7点起的,所以到做CF的时候已经17个小时没有休息了,再加上中午5小时的比赛. 头脑很不清晰.做第一个题的时候差点读成求最大字段和了.然后发现是水体,迅速A掉. 然后开始看了B题,第一遍没有看懂,此时大脑已经看不下去了.然后突然某个群说D是水题. 我去看了一下D,我去,D的题意好简单啊....于是,冥思苦想中.....一直到快要1点 的时候,还是没有结果...此时我感觉不行了..要放弃D,于是,又去看B.仔细读了读题目, 才发现,B题才是真正的水题..一阵郁闷啊.

Codeforces_#370 (Div. 2)_A

http://codeforces.com/problemset/problem/711/A 忙了一天没做题,做到水题,我这水平也只能做水题了= = ! #include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[1005][8]; int main() { int n; scanf("%d",&n); getchar(); int fla