CodeForces - 367C Sereja and the Arrangement of Numbers

题目大意:

要求构建一个长为n的数组,其中每两种不同的元素必须有一对是相邻的

然后给出m个交易,如果数组中有q[i]这个元素,就给w[i]元钱,求最多能得到多少钱?

具体思路:

先求出有x个不同元素的最小长度,然后给钱排个序就好啦

怎么求最小长度呢?可以把数组看成一个完全图的一条路径

最小长度大概就是一个欧拉路径啦,奇偶分类讨论一下就好啦

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[5000000],b[5000000],x,y,i,j,n,m;
main()
{
    scanf("%I64d%I64d",&n,&m);
    for(i=2;i<=100000;i++)if((i-1)%2==0)a[i]=i*(i-1)/2+1;else a[i]=i*(i-1)/2+1+(i-2)/2;
    for(i=1;i<=m;i++)scanf("%I64d%I64d",&x,&y),b[x]+=y;
    sort(b+1,b+1+1000000);
    int top=0;
    while(n>=a[top])top++;
    top--;
    int ans=0;
    for(i=1;i<=top;i++)ans+=b[1000000-i+1];
    printf("%I64d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Orange-User/p/8439738.html

时间: 2024-08-01 17:04:05

CodeForces - 367C Sereja and the Arrangement of Numbers的相关文章

CodeForces 367 C Sereja and the Arrangement of Numbers 欧拉回路

Sereja and the Arrangement of Numbers 题解: ummm. 在一副图中,如果全部点的度数是偶数/只有2个点是奇数,则能一笔画. 考虑图的点数k为奇数的时候,那么每个点的度数都是偶数点,所以就是可以一笔画,答案为 1 +k * (i - kll) / 2; k为偶数的时候,所有的点是奇数点,我们保留2个点是奇数点,将其他的点改为偶数点,就可以一笔画了.  1 +k * (i - kll) / 2 + k/2 - 1. 代码: #include<bits/stdc

CodeForces 380A Sereja and Prefixes

A. Sereja and Prefixes time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Sereja loves number sequences very much. That's why he decided to make himself a new one following a certain algorithm

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 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]; priori

CodeForces 425D Sereja and Squares

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

构造 Codeforces Round #107 (Div. 2) B. Phone Numbers

题目传送门 1 /* 2 构造:结构体排个序,写的有些啰嗦,主要想用用流,少些了判断条件WA好几次:( 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 #include <vector> 9 #include <map> 10 #include <iostream> 11 #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 ,那么可以枚举

codeforces 851D Arpa and a list of numbers

目录 codeforces 851D Arpa and a list of numbers 题意 题解 Code codeforces 851D Arpa and a list of numbers 题目传送门 题意 给出\(n\)个数,有两种操作: 1.将一个数从数列中删除,代价为\(x\). 2.将一个数加1,代价为\(y\). 询问最少花费多少的代价能够使数列中所有数的\(Gcd\)不为1. \((1 \leq n \leq 5 \cdot 10^5 , 1 \leq x,y \leq 1