首页 > 代码库 > codeforces_#243 (Div.2)

codeforces_#243 (Div.2)

A题,426A,Sereja and Mugs

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

解题思路:

这个还要说吗?

/*************************************************************************
	> File Name: 1.cpp
	> Author: boblee
	> Mail: boblee0717@gmail.com 
	> 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: boblee0717@gmail.com 
	> 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: boblee0717@gmail.com 
	> 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;
}