百度首页 | 百度空间
 
查看文章
 
2006年百度之星程序设计大赛初赛题目3
2007-05-14 17:37

  变态的比赛规则
     为了促进各部门员工的交流,百度(baidu)举办了一场全公司范围内的"拳皇友谊赛",负责组织这场比赛的是百度的超级"拳皇"迷W.Z. W.Z不想用传统的淘汰赛或者循环赛的方式,而是自己制定了一个比赛规则。
     由于一些员工(比如同部门或者相临部门员工)平时接触的机会比较多,为了促进不同部门之间的交流,W.Z希望员工自己组成不同组。不同组之间的每两个人都会进行一场友谊赛而同一组内的人则之间不会打任何比赛。
     比如4个人,编号为1--4,如果分为两个组并且1,2一个组,3,4一个组,那么一共需要打四场比赛:1 vs 3,1 vs 4,2 vs 3,2 vs 4. 而如果是1,2,3一组,4单独一组,那么一共需要打三场比赛: 1 vs 4,2 vs 4,3 vs 4.
     很快W.Z意识到,这样的比赛规则可能会让比赛的场数非常多。W.Z想知道如果有N个人,通过上面这种比赛规则,总比赛场数有可能为K场吗?比如3个人,如果只分到一组则不需要比赛,如果分到两组则需要2场比赛,如果分为三组则需要3场比赛。但是无论怎么分都不可能只需要1场比赛。
     相信作为编程高手的你一定知道该怎么回答这个问题了吧? 那么现在请你帮助W.Z吧。

输入
    每行为一组数据,包含两个数字 N, K。(0<N<=500, K>=0)
输出
    对输入的N,K 如果N个员工通过一定的分组方式可能会一共需要K场比赛,则输出"YES",否则输出"NO",每组数据占一行。

所有的输入输出均为标准输入输出。

例子

输入文件:
2 0
2 1
3 1
3 2

输出:
YES
YES
NO
YES


类别:百度之星历年题目 | 添加到搜藏 | 浏览() | 评论 (13)
 
最近读者:
 
网友评论:
1
2007-05-18 01:06
能不能公布一下解题的算法呢?让新手也有一个提高自己的机会呢?谢谢了
 
2
2007-05-21 03:17
#include<fstream>
#include <iostream>

using namespace std;

void solve(int n, int k)
{
int i;
bool is_ok = false;
for(i=0; i< (n/2 +1);i++)
{
if(i*(n-1) == k)
is_ok = true;
}

if(is_ok)
{
cout << "YES"<<endl;
}else{
cout << "NO"<<endl;
}
}
int main()
{
int k;
int n;
ifstream fin("input_5.txt" );
if(! fin)
cout <<"error in open corpus.txt";
while(! fin.eof())
{
fin >> n;
fin >>k;
solve(n, k);
}
fin.close();
}
 
3
2007-05-21 08:49
#include<fstream>
#include <iostream>

using namespace std;

int a[500];
bool isok;
int cur_n;
long cur_k;

void calculate(int total)
{
long sum = 0;
int i, j;

for (i=0; i < total - 1; i++)
{
for(j = i+1; j< total; j++)
sum += a[i]*a[j];
}
for (i=0; i < total; i++)
cout << a[i]<<" ";
cout << endl;
if(sum == cur_k)
{
isok = true;
}
}

void fillGroup(int n, int group_id)
{
int i;
for(i=1; i<= n/2;i++)
{
a[group_id] = i;
a[group_id+1] = n -i;
calculate(group_id+2);
if(isok)
return;
if(n>i)
{
fillGroup(n-i, group_id+1);
}
}
}

 
4
2007-05-21 08:49
void solve(int n, long k)
{
isok = false;
fillGroup(n, 0);
if(isok)
{
cout << "YES"<<endl;
}else{
cout << "NO"<<endl;
}
}

int main()
{
ifstream fin("input_5.txt" );
if(! fin)
{
cout <<"error in open corpus.txt";
exit(1);
}
while(! fin.eof())
{
cur_n = 0;
cur_k = 0;
fin >> cur_n;
fin >>cur_k;
if(cur_k == 0)
{
cout <<"YES"<<endl;
continue;
}
solve(cur_n, cur_k);
}
fin.close();
}
 
5
2007-05-21 08:50
3楼和4楼是一连在一起的,长度限制,所以分两次发!
 
6
2007-05-22 17:51
2楼程序有问题~~~
 
7
2007-05-22 17:56
Eli261的程序可借鉴一下。
 
8
2007-05-23 11:33
总比赛场数可以這樣算:
long sum = 0;
for(int i = 0; i < total; ++i)
sum += a[i] * (n - a[i]);
sum /= 2;
 
9
2007-05-25 19:53
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 500

typedef struct Lnode
{
int data;
bool result;
struct Lnode* next;
} Lnode;

Lnode note[MAX];
Lnode* head[MAX];

bool fun( int n, int k )
{
Lnode* p = head[n - 1] -> next;
bool h;
int tmp, i;
while ( p != NULL && p -> data != k )
{
p = p -> next;
}
if ( p != NULL )
{
return p -> result;
}
for ( i = 1, h = false; i <= ( n >> 1 ); ++i )
{
tmp = k - i * ( n - i );
if ( tmp == 0 || ( tmp > 0 && fun( n - i, tmp ) ) )
{
h = true;
break;
}
}
p = ( Lnode* )malloc( sizeof( Lnode ) );
p -> data = k;
p -> result = h;
p -> next = head[n - 1] -> next;
head[n - 1] -> next = p;
return h;
}
 
10
2007-05-25 19:54
void del( Lnode* L )
{
Lnode* p = L -> next;
Lnode* tmp;
while ( p != NULL )
{
tmp = p;
p = p -> next;
free( tmp );
}
}

int main( void )
{
int n, k, i;
for ( i = 0; i < MAX; ++i )
{
head[i] = &( note[i] );
head[i] -> next = NULL;
}
scanf( "%d%d", &n, &k );
k == 0 ? k = n - 1 : NULL;
clock_t t = clock();
printf( "%s\n", fun( n, k ) == true ? "YES" : "NO" );
for ( i = 0; i < MAX; ++i )
{
del( head[i] );
}
t = clock() - t;
printf( "Time = %d\n", t );
system( "pause" );
return 0;
}
注:文件打开和读取没有写,可以自己改
 
11
2008-05-15 20:36
#include <stdio.h>

int stepby(int n)
{
if(n == 1)
{
return 1;
}else
{
return n*stepby(n-1);
}
}

static
int check(int N, int K)
{
int i, j, flag = -1;

if(N>500 || N<0 || K<0)
return -1;
if(!K)
return 0;
for(i = 2;i<=N;i++)
{
if((N-i+1)*stepby(i -1) == K)
flag = 0;
}
return flag;
}
int main()
{
FILE* file, *fo;
int N,K;

file = fopen("in.txt","r");
fo = fopen("out.txt","w");

while(fscanf(file, "%d %d", &N, &K) >0)
{
if(!check(N, K))
{
fprintf(fo, "YES\n");
}else
{
fprintf(fo, "NO\n");
}
}

if(file)
fclose(file);
if(fo)
fclose(fo);
return 0;
}
 
12
2008-08-03 11:32
关注百度之星~~~~~~~~!
 
13
2008-08-04 13:13
看一下,留下脚印
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu