此题略坑。。。

思路:把N个点分成m若干个联通子图,然后用m-1个桥把这m个联通子图连接起来即可。

若每个联通子图内部都是完全图也符合题意,但答案却是Wrong Answer,只有把每个联通子图内部当成环来输出才通过,这是本题的一个坑,一个Bug!!!

另外联通子图中点的个数不能等于2(如果不明白请读者认真思考5遍)

第三个要注意的地方就是输出时每个联通子图只能有一个点与外界连接,不能有两个!!!(如果不明白请读者认真思考10遍)

关键在于确定每个联通子图中点的个数,若第i个联通子图中的点个数为a[i],则Σa[i]=N,且Σ(a[i]*(n-a[i]))=2K

即Σa[i]=N- 2K ,Σa[i]=N

方法有两种:DP 和 搜索

DP:

set<int>s[105];

s[i]是和为i的若干个数的平方和的集合。

dp[105][10005]

若干个数和为i,平方和为j,则dp[i][j]为这些数中最大的那个

     s[0].insert(0);
for (int i=0;i<100;++i)
for (set<int>::iterator it=s[i].begin();it!=s[i].end();++it)
for (int j=i?dp[i][*it]:1;j<=100-i;++j)
{
if (j==2) continue;
s[i+j].insert((*it)+j*j);
dp[i+j][(*it)+j*j]=j;
}

  

搜索:

找出一组数,和为N,平方和为N- 2K :

若找到了这样的一组数,返回数的个数,否则返回0

 int check(int x,int n,int depth)
{
if (n*n<x) return 0;
for (int i=(depth>1)?a[depth-1]:1;i<=n && x-i*i>=n-i;++i)
{
if (i==2) continue;
a[depth]=i;
if (i==n && i*i==x) return depth;
int y=check(x-i*i,n-i,depth+1);
if (y) return y;
}
return 0;
}

  

完整代码如下:

DP版:

/*************************************************************************
> File Name: D.cpp
> Author: Chierush
> Mail: qinxiaojie1@gmail.com
> Created Time: 2013年08月02日 星期五 09时05分46秒
************************************************************************/ #include <iostream>
#include <cstring>
#include <cstdlib>
#include <set>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm> #define LL long long
#define LLU unsigned long long using namespace std; int a[101],cnt;
int dp[105][10005]; set<int>s[105]; int main()
{
s[0].insert(0);
for (int i=0;i<100;++i)
for (set<int>::iterator it=s[i].begin();it!=s[i].end();++it)
for (int j=i?dp[i][*it]:1;j<=100-i;++j)
{
if (j==2) continue;
s[i+j].insert((*it)+j*j);
dp[i+j][(*it)+j*j]=j;
}
int n,k;
scanf("%d%d",&n,&k);
int x=n*n-2*k;
if (x<n)
{
puts("-1");
return 0;
}
if (!dp[n][x]) puts("-1");
else
{
int p=n,q=x;
for (;;)
{
if (!p || !q) break;
int o=dp[p][q];
a[cnt++]=o;
p-=o,q-=o*o;
}
sort(a,a+cnt);
for (int i=1;i<cnt;++i) a[i]+=a[i-1];
for (int i=1;i<a[0];++i) printf("%d %d\n",i,i+1);
if (a[0]>1) printf("%d %d\n",1,a[0]);
for (int i=1;i<cnt;++i)
{
printf("%d %d\n",a[i-1],a[i]);
for (int j=a[i-1]+1;j<a[i];++j) printf("%d %d\n",j,j+1);
if (a[i]-a[i-1]>1) printf("%d %d\n",a[i-1]+1,a[i]);
}
}
return 0;
}

搜索版:

/*************************************************************************
> File Name: D.cpp
> Author: Chierush
> Mail: qinxiaojie1@gmail.com
> Created Time: 2013年08月02日 星期五 09时05分46秒
************************************************************************/ #include <iostream>
#include <cstring>
#include <cstdlib>
#include <set>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <algorithm> #define LL long long
#define LLU unsigned long long using namespace std; int a[101],cnt; int check(int x,int n,int depth)
{
if (n*n<x) return 0;
for (int i=(depth>1)?a[depth-1]:1;i<=n && x-i*i>=n-i;++i)
{
if (i==2) continue;
a[depth]=i;
if (i==n && i*i==x) return depth;
int y=check(x-i*i,n-i,depth+1);
if (y) return y;
}
return 0;
} int main()
{
int n,k;
scanf("%d%d",&n,&k);
int x=n*n-2*k;
if (x<n)
{
puts("-1");
return 0;
}
int u=check(x,n,1);
if (!u) puts("-1");
else
{
for (int i=2;i<=u;++i) a[i]+=a[i-1];
for (int i=1;i<a[1];++i)
printf("%d %d\n",i,i+1);
if (a[1]>1) printf("%d %d\n",1,a[1]);
for (int i=2;i<=u;++i)
{
printf("%d %d\n",a[i-1],a[i]);
for (int j=a[i-1]+1;j<a[i];++j)
printf("%d %d\n",j,j+1);
if (a[i]-a[i-1]>1) printf("%d %d\n",a[i-1]+1,a[i]);
}
}
return 0;
}

  

Ural_1169_Pairs的更多相关文章

随机推荐

  1. apply plugin: 'idea' --- gradle idea

    如果你的项目使用了Gradle作为构建工具,那么你一定要使用Gradle来自动生成IDE的项目文件,无需再手动的将源代码导入到你的IDE中去了. 如果你使用的是eclipse,可以在build.gra ...

  2. element-ui 的 日历 datetimerange 日期格适化 , 适合1版本

    这家伙把我坑坏了 , 本来吧数据准备好了 , 一掉接口居然不好使 ,日期总是有偏差 , 结果一看是提交的数据有问题 , 后台直接接受的字符串 new 的Date , 2017-12-24T16:00: ...

  3. C# WPF 仿网易云音乐(PC)Banner动画控件

    在自定义用户控件内添加3个border(左.中.右,以下分别简称为:b1.b2.b3),对border进行缩放和移动动画.往右切换时b1放大平移到b2的位置,b2缩小平移到b3的位置,b3平移到b1的 ...

  4. C++:怎样把一个int转成4个字节?

    大家都知道,一个int 或 unsigned int是由4个字节组成的,(<C/C++学习指南>,第3章,第3.2.3节:变量的内存视图) 比如, int   n  =  sizeof( ...

  5. Open SSL 开发环境配置

    Open SSL 开发环境配置 最后更新日期:2014-05-13 阅读前提:VisualStudio的基本使用.Cent OS的基本使用 环境: Windows 8.1 64bit英文版,Visua ...

  6. python3 小技巧(2)

    原文 http://blog.csdn.net/jclass/article/details/6145078 一. base64 编码和解码任意的二进制字符串到文本字符串(主要用在HTTP EMAIL ...

  7. 统计web訪问前10的ip

    cat access.log|awk '{print $0}'|sort|uniq -c|sort -nr|head -n 10

  8. C#彩色艺术化二维码样式设计(仅说思路)

    原文:C#彩色艺术化二维码样式设计(仅说思路) 仅讲思路,想要源码的请绕道.   一.样式 1.先看各种二维码的样式吧: (1)最简单的样式--黑白样式,如下图: 图1  最平常见到的二维码样式(如果 ...

  9. WPF 附加属性的使用

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  10. DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版原创发布

    关于 DotNetBar for Windows Forms 14.0.0.3_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...