2014西安赛区C题

将A[i]同他后面比他小的建边,然后求最大密度子图

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
const int maxn=105;
const double eps=0.00000001;
const double INF=100000005;
vector<int>ans;
struct Dinic
{
     struct Edge
     {
         int from,to;
         double cap,flow;
         Edge(int cfrom=0,int cto=0,double ccap=0,double cflow=0)
         {
             from=cfrom; to=cto; cap=ccap; flow=cflow;
         }
     };
     int n,m,s,t;
     vector<Edge>edges;
     vector<int>G[maxn];
     bool vis[maxn];
     int d[maxn];
     int cur[maxn];
     void init(int n)
     {
         this->n=n;
         m=0;
         edges.clear();
         for(int i=0; i<=n; i++)G[i].clear();
     }
     void AddEdge(int from,int to,double cap)
     {
           edges.push_back(Edge(from,to,cap,0));
           edges.push_back(Edge(to,from,0,0));
           m+=2;
           G[from].push_back(m-2);
           G[to].push_back(m-1);
     }
     bool BFS()
     {
         memset(vis,false,sizeof(vis));
         queue<int>Q;
         Q.push(s);
         d[s]=0;
         vis[s]=1;
         while(!Q.empty())
         {
             int x=Q.front(); Q.pop();
             for(int i=0; i<G[x].size(); i++)
             {
                 Edge &e =edges[G[x][i]];
                 if(vis[e.to]==false&&e.cap>e.flow)
                 {
                     vis[e.to]=1;
                     d[e.to]=d[x]+1;
                     Q.push(e.to);
                 }
             }
         }
         return vis[t];
     }
     double DFS(int x, double a)
     {
         if(x==t||a==0)return a;
        double flow=0,f;
        for(int &i=cur[x]; i<G[x].size(); i++)
        {
            Edge &e=edges[G[x][i]];
            if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0)
            {
                e.flow+=f;
                edges[G[x][i]^1].flow-=f;
                flow+=f;
                a-=f;
                if(a==0)break;
            }
        }
        return flow;
     }
     double Maxflow(int s,int t)
     {
         this->s=s; this->t=t;
         double flow=0;
         while(BFS())
         {
             memset(cur,0,sizeof(cur));
             flow+=DFS(s,INF);
         }
         return flow;
     }
}T;
int d[maxn];
int A[maxn*maxn],B[maxn*maxn];
int N[maxn];
double U;
void build(int n,int m,double g)
{
    T.init(n+2);
    for(int i=1; i<=n; i++)
    {
        T.AddEdge(n+1,i,U);
        T.AddEdge(i,n+2,U+g*2-d[i]);
    }
    for(int i=0; i<m; i++)
    {
        T.AddEdge(A[i],B[i],1);
        T.AddEdge(B[i],A[i],1);
    }
}
int main()
{
    int cas;
    scanf("%d",&cas);
    for(int cc=1; cc<=cas; cc++)
    {
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n; i++)
            scanf("%d",&N[i]);
        int m=0;
        memset(d,0,sizeof(d));
        for(int i=1; i<=n; i++)
            for(int j=i+1; j<=n; j++)
           if(N[i]>N[j]){
                d[N[i]]++;d[N[j]]++;
             A[m]=N[i];B[m]=N[j]; m++;
          }
        if(m==0)
            {
                printf("Case #%d: 0.0000000\n",cc);
                continue;
            }
        double L=0,R=m;
        U=m;
        while(R-L>=eps)
        {
            double mid=(L+R)*0.5;
            build(n,m,mid);
            double ans=T.Maxflow(n+1,n+2);
            ans=(U*n-ans)*0.5;
            if(ans>0)L=mid;
            else R=mid;
        }
        printf("Case #%d: %.7lf\n",cc,L );
    }
    return 0;
}
/*
2
5
3 4 2 5 1
5
2 1 3 4 5
*/

时间: 2024-12-15 23:49:47

2014西安赛区C题的相关文章

HDOJ 5007 Post Robot--2014网络赛西安赛区A题

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5007 Post Robot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 193    Accepted Submission(s): 164 Problem Description DT is a big fan of digital

HDOJ 5012 Dice--2014网络赛西安赛区F题

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=5012 Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 307    Accepted Submission(s): 183 Problem Description There are 2 special dices on the

2014 39th ACM-ICPC 西安赛区 总结

西安,打铁. 出发前听说是大赛区,签到的时候看了秩序册的队伍情况,264支队伍. 在听说是大赛区之前,我觉得我们队应该是银首,运气好+发挥超常的话或许有金,即保银冲金. 听到大赛区之后,觉得可能金区有难度,毕竟金的数量不根据队伍总数改变.当时觉得应该是银,运气差+发挥失常就是铜首. 万万没想到,打铁. 同行的另外还有三支队伍.大二的两支队伍,一支银一支铜.好像我们学院好久没有打铁了 热身赛,纸质很差,纸张黄黄的,字体模糊的,还很薄.共4题. 先是2题水题CD,我跟JM迅速水完后,WJ说B是冒泡的

[hdu5136]Yue Fei&#39;s Battle 2014 亚洲区域赛广州赛区J题(dp)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 现场赛的时候由于有个地方有点小问题,没有成功AC,导致与金牌失之交臂. 由于今天下午有点事情,无法打重现,所以下午只是花了十分钟做了一道J题,抢了个FB,2333333333 Yue Fei's Battle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)T

HDU - 4814 Golden Radio Base (长春赛区B题)

最小二乘法又叫做最小平方法,是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配. 通常情况下最小二乘法用于求回归问题.以简单的线性最小二乘为例,二维平面上给定个点的坐标,确定一条直线, 要求大致符合这个点的走向. 我们可以设这条直线的方程为,那么就要使在处的函数值与给定的值相 差达到最小,也就是说,要确定的值,使得 最小.根据这种方法求的值就是典型的最小二乘法. 可以看出是的一个二元函数,要求的最小值,那么求偏导,有 进一步得到 然后联立两式可以解出,如果方程数比较多,我们可以用

西安邀请赛J题 状态压缩DP

Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具.Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构.host以及任何一张图,还可以与LDAP结合进行用户验证,同时也能自己增加模板,功能非常强大完善.界面友好.软件 Cacti 的发展是基于让 RRDTool 使用者更方便使用该软件,除了基本的 Snmp 流量

擦肩而过的那块牌--记ACM_ICPC西安赛区现场赛

说了那么多次orz,这次是真的orz了,去了西安打区域赛,也想过会打铁,但当最终那一刻确定打铁了之后,心里还是很不开心的,颁奖的时候思考熊那家伙嚣张的举起来手中那个金杯,说实话闪到我眼了(太亮了QAQ),打铁怨谁,这不好说,很多因素,别人别的我就不说了,但不能读英语实在让我不能忍,都说读不懂,带的那本字典几乎都没翻我会乱说?比完赛怨不该开f题,但当时3个半小时没人看i题,也怨我,一看到min就怯了,后来揭榜看到离铜牌区差8名,差12分钟..我呵呵了,第二题re一次罚时20分钟,可以说那次罚时也是

HDU - 4813 Hard Code (长春赛区水题)

Description Some strange code is sent to Da Shan High School. It's said to be the prophet's note. The note is extremely hard to understand. However, Professor Meng is so smart that he successfully found the pattern of the code. That is, the length of

BNUOJ 34985 Elegant String 2014北京邀请赛E题 动态规划 矩阵快速幂

Elegant String Time Limit: 1000msMemory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,-, k