You Who?

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 801   Accepted: 273

Description

On the first day of first grade at Friendly Elementrary School, it is customary for each student to spend one minute talking to every classmate that he or she does not already know. When student Bob sees an unfamilar face, he says ``You who?'' A typical response is ``Me Charlie, you who?'' Then Bob says, ``Me Bob!'' and they talk for a minute. It's very cute. Then, after a minute, they part and each looks for another stranger to greet. This takes time. In class of twenty-nine or thirty mutual strangers, it takes 29 minutes; time that, according to teachers, could be better spent learning the alphabet. Of course, it is rare to have a first grade class where nobody knows anyone else; there are neighbors and playmates who already know each other, so they don't have to go through the get-to-know-you minutes with each other.
The two first grade teachers have requested that, to save time,
students be allocated to their two classes so that the difference in the
sizes of the classes is at most one, and the time it takes to complete
these introductions is as small as possible. There are no more than 60
students in the incoming first grade class.

How can the assignment of students to classes be made? Your job is to write the software that answers the question.

Input

The
school records include information about these student friendships,
represented as lists of numbers. If there are 29 students, then they
are represented by the numbers 1 to 29. The record for a single student
includes, first, his/her student identification number (1 to 29, in
this example), then the number of his/her acquaintances, then a list of
them in no particular order. So, for example, this record

17 4 5 2 14 22

indicates that student 17 knows 4 students: 5, 2, and so on. The
records for all the students in the incoming class are represented as
the list of numbers that results from concatenating all the student
records together. Spaces and line breaks are irrelevent in this format.
Thus, this

1 1 2 2 1 1

is a whole database, indicating that there are only two students in the incoming class, and they know each other; and this

1 2 3 4

2 2 3 4

3 2 1 2

4 2 1 2

indicates that 1 doesn't know 2, and 3 doesn't know 4, but all other pairs know each other.

The database has been checked for consistency, so that if A knows B, then B knows A.

Output

Your
output should begin with a number that tells how long it will take to
complete the introductions in the best possible legal class assignment.
For the simple two student problem above, the only legal answer is

0

Sample Input

1 2 3 4
2 2 3 4
3 2 1 2
4 2 1 2

Sample Output

0

Hint

To make this problem more tractable, the following changes are being made. There will be exactly two classes. There will be no more that 30 students. The students will be divided as evenly as possible between the classes. The loneliness of a student is the number of students in his class whom he does not know. You are to arrange the classes to minimize the loneliness of the loneliest student. for the sample data ,you can arrange 1 and 3 to the first class,and 2 and 4 to the second class,then they need no time to know each other.
 
我本来的程序中有考虑最大不认识的人数是否需要加1的情况,结果被判wrong。
最近找了个当年比赛的标准程序,发现其本意还真是只要找所有分组情况中,两组里最大不认识的人数最小的那个情况即可。
并且原题的测试数据也是这个:
Judge's Input
1 0
2 0
3 0
4 0
5 0
Judge's Output
2
2 1 2
3 3 4 5
可能编题目的作者也没有料到有这个(浅显的)问题,于是整个背景叙述就显得如此荒诞了。
POJ简化题目——班级的输出免了,但误人的背景留了下来。 顺便说一下,标程是用非常复杂的位运算实现的,这样和人多人少关系就不大了。
总人数最多是30个(于是每个人与他人的关系、每个班的组成(最多15个人)都可以用一个unsigned表示),算法就是穷举。 分析:题目对我来说感觉蛮难理解的,可能是因为数学太弱?这个题目数据比较弱,poj上最多4个students,所以算是水题了。
/*
1 2 3 4
2 2 3 4
3 2 1 2
4 2 1 2
*/ #include "stdio.h"
#include "stdlib.h"
#include "string.h" #define MAX_STUDENT 30 int gwFriendList[MAX_STUDENT+1][MAX_STUDENT+1];
int gwdivide[MAX_STUDENT+1];
int gwStudentNum; int MAX(int a, int b)
{
return (a>b) ? a : b;
} int MIN(int a, int b)
{
return (a>b) ? b : a;
} int strangeNum(int wboy, int class[])
{
int i = 0;
int j = 0;
int lone = 0;
for(i=1; i<=class[0]; i++)
{
if(wboy == class[i])
continue;
for(j=1; j<=gwFriendList[class[i]][0]; j++)
{
if(wboy == gwFriendList[class[i]][j])
break;
}
if(j > gwFriendList[class[i]][0])
lone++;
}
return lone;
} void exchangeValue(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
} void buildClass(int class[], int flag)
{
int i = 0;
int j = 0;
for(i=1; i<=gwStudentNum; i++)
{
if(gwdivide[i] == flag)
class[++j] = i;
}
class[0] = j;
} int calcLone(int class[])
{
int i = 0;
int lone = 0;
for(i=1; i<=class[0]; i++)
{
lone = MAX(lone, strangeNum(class[i], class));
}
return lone;
} int Lone()
{
int class1[MAX_STUDENT+1];
int class2[MAX_STUDENT+1];
buildClass(class1, 1);
buildClass(class2, 0);
return MAX(calcLone(class1), calcLone(class2));
} int divideClass(int now, int max)
{
int wlone = 30;
int i = 0;
if(now == max)
return Lone();
else
{
wlone = MIN(wlone, divideClass(now+1, max));
for(i=now+1; i<=max; i++)
{
if(gwdivide[i] != gwdivide[max])
{
exchangeValue(&gwdivide[i], &gwdivide[max]);
wlone = MIN(wlone, divideClass(i, max));
exchangeValue(&gwdivide[i], &gwdivide[max]);
}
}
return wlone;
}
} int main()
{
int i = 0;
int j = 0;
int wCount = 0;
int lone = 0; while(1)
{
if(EOF == scanf("%d", &j))
break;
scanf("%d", &wCount);
gwFriendList[j][0] = wCount;
gwStudentNum++;
for(i=1; i<=wCount; i++)
{
scanf("%d", &gwFriendList[j][i]);
}
wCount = 0;
}
for(i=1; i<=(gwStudentNum/2); i++)
{
gwdivide[i] = 1;
} lone = divideClass(1,gwStudentNum); printf("%d\n", lone);
return 0;
}


北大poj-1081的更多相关文章

  1. 北大POJ题库使用指南

    原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...

  2. poj 1081 To The Max

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. 【Java】深深跪了,OJ题目Java与C运行效率对比(附带清华北大OJ内存计算的对比)

    看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. -------------------------------------- 这是切割线 ----------- ...

  4. POJ 1861 Network (Kruskal算法+输出的最小生成树里最长的边==最后加入生成树的边权 *【模板】)

    Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14021   Accepted: 5484   Specia ...

  5. 各大OJ

    北大POJ 杭电HDU 浙大ZOj 蓝桥杯 PAT

  6. leetcode学习笔记--开篇

    1 LeetCode是什么? LeetCode是一个在线的编程测试平台,国内也有类似的Online Judge平台.程序开发人员可以通过在线刷题,提高对于算法和数据结构的理解能力,夯实自己的编程基础. ...

  7. OJ题目JAVA与C运行效率对比

    [JAVA]深深跪了,OJ题目JAVA与C运行效率对比(附带清华北大OJ内存计算的对比) 看了园友的评论之后,我也好奇清橙OJ是怎么计算内存占用的.重新测试的情况附在原文后边. ----------- ...

  8. C++ 指针常见用法小结

    1. 概论 2.指针基础 3. 指针进阶 4. 一维数组的定义与初始化 5. 指针和数组 6. 指针运算 7. 多维数组和指针 8. 指针形参 9. 数组形参 10. 返回指针和数组 11. 结语   ...

  9. 几个比較好的IT站和开发库官网

    几个比較好的IT站和开发库官网 1.IT技术.项目类站点 (1)首推CodeProject,一个国外的IT站点,官网地址为:http://www.codeproject.com,这个站点为程序开发人员 ...

  10. C语言程序设计100例之(10):最大公约数

    例10        最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. 输入数据 第 ...

随机推荐

  1. java根据标点英文分词

    最近学习java字符串部分,用正则表达式做了一个简单的统计单词出现次数的小程序,目前只能统计英文. 整个程序包括三个包,分别为output,run,wordcount wordCount包 执行单词统 ...

  2. Vue2.X的路由管理记录之 钩子函数(切割流水线)

    $route可以在子组件任何地方调用,代表当前路由对象,这个属性是只读的,里面的属性是 immutable(不可变) 的,不过你可以 watch(监测变化) 它. 导航和钩子函数: 导航:路由正在发生 ...

  3. 判断整数是否能被n整除

    (1)1与0的特性:         1是任何整数的约数,即对于任何整数a,总有1|a.         0是任何非零整数的倍数,a≠0,a为整数,则a|0. (2)若一个整数的末位是0.2.4.6或 ...

  4. BZOJ2329 [HNOI2011]括号修复

    把左括号看做$1$,右括号看做$-1$,于是查询操作等于查询一个区间左边右边最大(最小)子段和 支持区间翻转,反转,覆盖操作...注意如果有覆盖操作,之前的操作全部作废了...于是在下传标记的时候要最 ...

  5. 深度讲解VIEWPORT和PX是什么?移动端单位px,em,rem

    刚开始接触移动页面重构,是不是很迷惑应该按照多大的尺寸制作?320.640还是720?按照640的设计稿重构完页面,是不是还需要写其他尺寸来适配不同的屏幕大小?—— 这源于对viewport和px的不 ...

  6. Shell中的空格和引号

    空格对于linux的shell是一种很典型的分隔符,所以给变量赋值的时候中间不能够有空格.而单引号和双引号,都是为了解决中间有空格的问题.比如string1=this is a string,这样执行 ...

  7. WCF初探-25:WCF中使用XmlSerializer类

    前言 在上一篇WCF序列化和反序列化中,文章介绍了WCF序列化和反序列化的机制,虽然WCF针对序列化提供了默认的DataContractSerializer序列化引擎,但是WCF还支持其他的序列化引擎 ...

  8. mac 安装mvn 失败

    安装过程遇到2个问题 1.java版本不对 2.Error: JAVA_HOME is not defined correctly. We cannot execute $/usr/libexec/j ...

  9. logresolve - 解析Apache日志中的IP地址为主机名

    logresolve是一个解析Apache访问日志中IP地址的后处理程序. 为了使对名称服务器的影响降到最低,logresolve拥有极为自主的内部散列表缓存, 使每个IP值仅仅在第一次从日志文件中读 ...

  10. WCF传输大数据的设置

    在从客户端向WCF服务端传送较大数据(>65535B)的时候,发现程序直接从Reference的BeginInvoke跳到EndInvoke,没有进入服务端的Service实际逻辑中,怀疑是由于 ...