2014-2015 CT S02E10 C题 Coin Graph 构造+贪心

题意:给定一个数s,构造一个无向图,使得任意两点的最短路径和为s。

思路:二分找到n,满足n×(n-1)/2<=s,且n尽可能大。这样的图,相当于n个点每两个点都连一条边。窝们考虑这样一种构造方法,

假设现在有n个点,我们按照逆时针方向(顺时针也行)排序编号,那么我们间隔删去不相邻点的的边,比如5个点,我们删去

1--3,1--4,...,1--n-2,1---n-1,保留2,删3--5,3--6,...3--n-2,3----n-1,保留4,删5--7,5--8,...,5--n-1。这样可以保证每删一条边最短路径和+1。

那么n个点最多可删去(n-3)+(n-2)+...+1=(n-3)×(n-2)/2。我们发现(n+1)×n/2-n×(n-1)/2=n,(n-3)×(n-2)/2>=n --->n>=6,即15以上的值均

可按照这种方法构造。s<15的,除了2和5无法构造,都可以在上述的图基础上再删去边构成即可。详见代码:

/*********************************************************
  file name: C.cpp
  author : kereo
  create time:  2015年02月02日 星期一 18时45分37秒
*********************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int sigma_size=26;
const int N=1000+50;
const int MAXN=100000+50;
const int inf=0x3fffffff;
const double eps=1e-8;
const int mod=100000000+7;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
#define PII pair<int, int>
#define mk(x,y) make_pair((x),(y))
int n,m;
int dp[N][N];
int binary(int x){
    int l=1,r=N,ans=0;
    while(l<=r){
        int mid=(l+r)>>1;
        if(mid*(mid-1)/2<=x)
            ans=mid,l=mid+1;
        else
            r=mid-1;
    }
    return ans;
}
int main(){
    while(~scanf("%d",&m)){
        if(m == 1){
            printf("2 1\n");
            printf("1 2\n");
            continue;
        }
        if(m == 2 || m == 5){
            printf("Impossible\n");
            continue;
        }
        if(m == 4){
            printf("3 2\n");
            printf("1 2\n");
            printf("1 3\n");
            continue;
        }
        memset(dp,-1,sizeof(dp));
        n=binary(m);
        m-=n*(n-1)/2;
        int cnt=(n+1)/2; cnt=(cnt+1)/2;//
        int num=0;
        for(int i=1;i<=cnt*2-1;i+=2){
            for(int j=1;j<=n-3-num && m;j++){
                dp[i][i+j+1]=0; dp[i+j+1][i]=0;
                m--;
            }
            if(m == 0)
                break;
            num++;
        }
        if(m){
            dp[1][n]=dp[n][1]=0;
            m--;
        }
        if(m){
            int k=(n+1)/2+1;
            dp[k][k+1]=dp[k+1][k]=0;
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                if(dp[i][j] == -1)
                    ans++;
        printf("%d %d\n",n,ans);
        for(int i=1;i<=n;i++)
            for(int j=i+1;j<=n;j++)
                if(dp[i][j] == -1)
                    printf("%d %d\n",i,j);
    }
    return 0;
}
时间: 2024-08-02 00:49:59

2014-2015 CT S02E10 C题 Coin Graph 构造+贪心的相关文章

2014-2015 CT S02E10 D题 Coin Table dp

题意:给定一个由"C"和"."构成的n×n图 给定查询次数m 每次查询给出r1,c1,r2,c2一个矩形 求从(1,1)到(n,n)不能走到所给矩形中(只能向右和向下),问最多可获得多少"C",以及获得这么多"C"的方法数 思路:我们定义一个pair<int,int>dp1[i][j]表示从(1,1)到(i,j)(只能向右和向下)可获得最多的"C"以及方法数,再定义pair<int,int

2012 2013 2014 2015 Skype for Business MVP-变迁

2005年,初识Live Communications Server 2003 2008年,相识Office Communication Server (OCS) 2007 2010年,相知Lync Server 2010 2012年,相恋Lync Server 2013 2015年,告别Skype for Business Server 2015 或许,我应该走了,不是您不好! 为您付出够多,但还是得离开! 不是吗? 2012 2013 2014 2015 从Lync MVP到Skype fo

2014北京大学考研高等代数第一题解答

[题目]设$f(x)=\prod_{j=1}^{2013}(x-j)^2+2014$,问$f(x)$在有理数域内是否可约?为什么? [分析]2014是个"噱头",不是本质的,应该对更一般的$n$都成立,注意到: (x?1)2(x?2)2+3=(x2?x+1)(x2?5x+7) ,所以猜测对$f(x)=\prod_{j=1}^{n}(x-j)^2+n+1$,$n$为奇数结论成立. [解答]不可约.用反证法,如果可约,那么$f(x)$一定在整数环上可约,即存在$g(x),h(x)\in Z

2014多校第一场D题 || HDU 4864 Task (贪心)

题目链接 题意 : 用N台机器,M个任务,每台机器都有一个最大工作时间和等级,每个任务有一个需要工作时间和一个等级.如果机器完成一个任务要求是:机器的工作时间要大于等于任务的时间,机器的等级要大于等于任务的等级.一台机器只能完成一个任务,一个任务只能被一台机器完成.每个机器完成一个任务公司能够获得500*xi+2*yi (此处xy都是指被完成的任务的).输出所有机器能完成的最多任务数,和最大盈利. 思路 :贪心,自己做的时候想了各种排序都不对,没有考虑到500*xi+2*yi 这个公式的重要性.

2015.12.29~2015.12.30真题回顾!-- HTML5学堂

2015.12.29~2015.12.30真题回顾!-- HTML5学堂 吃饭,能够解决饥饿,提供身体运作机能.练习就像吃饭,强壮自己,提升编程技能,寻求编程技巧的最佳捷径!吃饭不能停,练习同样不能停哦! HTML5真题[2015.12.29]题目 学习JavaScript或应用JavaScript进行脚本开发,“变量”这是必须要学会使用的.什么是变量呢?又什么作用呢?ok,大家稍安勿躁哦,试体验体验这题目<HTML5真题[2015.12.29]题目>与 <HTML5真题[2015.12

2014百度之星第一题Energy Conversion

Energy Conversion Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7787    Accepted Submission(s): 1894 Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量

2014百度之星第二题Disk Schedule

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1463    Accepted Submission(s): 189 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁

2014湘潭全国邀请赛I题 Intervals /POJ 3680 / 在限制次数下取有权区间使权最大/小问题(费用流)

先说POJ3680:给n个有权(权<10w)开区间(n<200),(区间最多数到10w)保证数轴上所有数最多被覆盖k次的情况下要求总权最大,输出最大权. 思路:       限制的处理:s-->开始流量为k,要求总权最大,即费用最大,所以费用取负,最小费用最大流即可.对于输入区间[a,b]:w,添加边:a-->b,流量为1,费用为-w. 对于点i,i+1,添加边,费用为0,流量无穷.显然这种处理,限制了区间最多取k次,(流量控制),跑最大流能走添加的边尽量走,且越大越好(负数刚刚是

2015 初赛TG 错题解析

2015 初赛TG 错题解析 得分:==81.5== 过失性失分:T6(1.5) 未掌握的知识点失分:T3(1.5) T12(1.5) T19(1.5) 未把已知活学活用T11(1.5) 没看懂程序 T26(8) T28-1(3) T3 1948 年,( )将热力学中的熵引入信息通信领域,标志着信息论研究的开端. A. 冯·诺伊曼(John von Neumann) B. 图灵(Alan Turing) C. 欧拉(Leonhard Euler) D. 克劳德·香农(Claude Shannon