zoukankan      html  css  js  c++  java
  • CodeForces

    题目大意:

    要求构建一个长为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;
    }
  • 相关阅读:
    python之enumerate
    PyCharm Debug 调试
    兼容性测试方法
    mongo基本命令
    mongodb启动
    安装STF
    新家
    用数组实现的最大堆(C++)
    VS2013调用GLPK求解线性规划
    转:Java读取txt文件和写入txt文件
  • 原文地址:https://www.cnblogs.com/Orange-User/p/8439738.html
Copyright © 2011-2022 走看看