CodeForces 425A Sereja and Swaps

题意:

一串数字  最多可以做k次交换数字  求  最大连续和是多少

思路:

n^2暴力枚举所有区间  那么如果要换数字  一定是从区间外拿大数换区间内的小数  优先队列可以完成操作

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define N 201

int n,m,ans;
int a[N];
priority_queue<int> q2;
priority_queue< int , vector<int> , greater<int> > q1;

int main()
{
    int i,j,k,sum,f1,f2;
    scanf("%d%d",&n,&m);
    for(i=1,ans=-10000;i<=n;i++)
    {
        scanf("%d",&a[i]);
        ans=max(ans,a[i]);
    }
    for(i=1;i<=n;i++)
    {
        for(j=i+1;j<=n;j++)
        {
            while(!q1.empty()) q1.pop();
            while(!q2.empty()) q2.pop();
            for(k=1,sum=0;k<=n;k++)
            {
                if(k<i||k>j) q2.push(a[k]);
                else
                {
                    q1.push(a[k]);
                    sum+=a[k];
                }
            }
            for(k=m;k&&!q1.empty()&&!q2.empty();k--)
            {
                f1=q1.top();
                q1.pop();
                f2=q2.top();
                q2.pop();
                if(f1<f2)
                {
                    sum-=f1;
                    sum+=f2;
                }
                else break;
            }
            ans=max(ans,sum);
            //printf("%d %d %d %d\n",i,j,sum,ans);
        }
    }
    printf("%d\n",ans);
    return 0;
}

CodeForces 425A Sereja and Swaps

时间: 2024-08-03 19:23:08

CodeForces 425A Sereja and Swaps的相关文章

Codeforces 425A Sereja and Swaps(暴力枚举)

题目链接:A. Sereja and Swaps 题意:给定一个序列,能够交换k次,问交换完后的子序列最大值的最大值是多少 思路:暴力枚举每一个区间,然后每一个区间[l,r]之内的值先存在优先队列内,然后找区间外假设有更大的值就替换掉. 求出每一个区间的最大值,最后记录下全部区间的最大值 代码: By lab104_yifan, contest: Codeforces Round #243 (Div. 2), problem: (C) Sereja and Swaps, Accepted, #

CF:Problem 425A - Sereja and Swaps 区间交换最大值

这题比赛的时候不会做,原来是区间暴力. 其实理解起来也觉得挺简单的,可能是看题的时候被交换这个思想束缚了自己的解题吧,所以一直想不出什么好的做法,看了别人的解题茅舍顿开-- 解法:就是在这个数列中先选出一段我们要求的区间,如果在中间取的这段的话,那旁边两段就是剩余的段,也就是我们需要至少k次交换剩余段中最大的值与刚开始选出的段交换最小的值,然后求这选出的这段的和,如此下去更新最大值就得到结果了.选出的段为 [ i , j ],剩余的段就是:[ 0 , i - 1 ] 与 [ j+1 , n -

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

CF243 DIV2 C Sereja and Swaps(暴力)

题意:给你一个数组,问你交换最多K个数以后,最大子串和为多少; 解题思路:枚举这个数组最大字串和的起点和终点,然后优先队列交换这段里面的小数去换外面的大数,即可求出答案! 解题代码: 1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2014年04月28日 星期一 19时04分36秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8

CodeForces 425C Sereja and Two Sequences

题意: 两组数字a和b  如果a[i]等于b[j]  则可将a[i]和b[j]前所有数字删掉  这种操作花费e体力  得到1元钱  或者一次删掉所有数字  这种操作花费等于曾经删除的所有数字个数  做完后得到所有钱  问 一共s体力 可以得到多少钱 思路: dp+二分 由数据可知最多拿到300元钱  因此可以定义  dp[i][j]表示有i元钱时  b串删除到了j处时  a串删到的位置 状态转移为 dp[i][j] = lower_bound ( a[j] , dp[i-1][j-1] + 1

CodeForces 425B Sereja and Table

题意: 一个充满0和1的矩形  最多将k个数字翻转  问  最少翻转几个数字可以使所有0或1的连通块都是矩形  如果不可能输出-1 思路: 首先  如果确定了一行  那么整个矩形就确定了 因为在最后的状态中  每一行要么与确定的行完全一致  要么完全相反  这才能保证连通块都是矩形 然后  本题k很小  因此可以分类讨论 如果 max(n,m)<=k 那么可以暴力枚举第一行状态  进而计算翻转次数  最多只有2^10种情况 否则 max(n,m)>k  那么至少有一行或者一列是没有被修改的  

CodeForces 425D Sereja and Squares

题意: 平面上有n个点  问  最多能组成多少个边与坐标轴平行的正方形 思路: 这是一个通过不断二分查找乱搞的题- 首先枚举左下角  然后分别往上往右找左上角和右下角 这时如果发现边长不想等就通过长边长度在短边的方向二分查找最接近的值  不停往上往右延伸 如果发现边长想等了  那么要判断一下对应的左上角坐标出是不是有一个点 怎么判断呢  通过将所有点hash出一个值  然后二分- 反正这题就是各种二分乱搞 - -b  复杂度不好算  大概是n*(同x的点数+同y的点数) 代码: #include

codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)

题目 给出一个n*m的01矩阵, 让你最多改变k个里面的值(0变1,1变0), 使得0.1的连通分量是矩阵.输出最少步数 1 ≤ n, m ≤ 100; 1 ≤ k ≤ 10 题解: 如果01连通分量是矩形, 那么矩形一定是这样的: 0101010 1010101 0101010 1010101 (上面的01代表子矩阵块). 也就是每一行要么是相同,要么是相反的. 如果n>k, 肯定有一行是不能改变的,那么枚举这一行,然后其余的要么变相同,要么变相反,看最少的步数. 如果n<k ,那么可以枚举