ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

SRM549 DIVⅡ 500pt(最大匹配)

Problem Statement

     The Order of All Things Pointy and Magical has commissioned the creation of some new wizard hats. A wizard hat is created by taking two cones: a decorative top cone, and a warm and fluffy bottom cone. To assemble the hat, both cones are first placed onto a table, so that their bases are horizontal and their apexes point upwards. The top cone is then lifted and placed onto the bottom cone. The base of the top cone has to remain horizontal, and the apex of the top cone must be strictly above the apex of the bottom cone.

Not every pair of cones can be used to create a wizard hat. A wizard hat is only produced if the following two criteria are both met:
  • The apex of the top cone must be strictly above the apex of the bottom cone. I.e., when the top cone is placed on top of the bottom cone and released, their apexes must not touch.
  • Some part of the bottom cone must remain visible to form the brim of the hat. (Otherwise, the hat would look like a simple cone, not like a wizard hat!)
You have several top cones and several bottom cones of various sizes. Each cone can be described by its height (the distance between the apex and the base) and by the radius of its base. The top cones you have are described by topHeight and topRadius: for each valid i, you have one top cone with height topHeight[i] and radius topRadius[i]. The bottom cones you have are described by bottomHeight and bottomRadius in the same way.

Your task is to determine the maximum number of wizard hats you can make using each of the available top and bottom cones at most once.

Definition

    
Class: PointyWizardHats
Method: getNumHats
Parameters: vector <int>, vector <int>, vector <int>, vector <int>
Returns: int
Method signature: int getNumHats(vector <int> topHeight, vector <int> topRadius, vector <int> bottomHeight, vector <int> bottomRadius)
(be sure your method is public)
    

Constraints

- topHeight and topRadius will contain the same number of elements.
- bottomHeight and bottomRadius will contain the same number of elements.
- topHeight will contain between 1 and 50 elements, inclusive.
- topRadius will contain between 1 and 50 elements, inclusive.
- bottomHeight will contain between 1 and 50 elements, inclusive.
- bottomRadius will contain between 1 and 50 elements, inclusive.
- Each element of topHeight, topRadius, bottomHeight, and bottomRadius will be between 1 and 10,000, inclusive.

Examples

0)
    
{30}
{3}
{3}
{30}
Returns: 1
The top and bottom cone can be used together to make a wizard hat.
1)
    
{4,4}
{4,3}
{5,12}
{5,4}
Returns: 1
The only way to produce a wizard hat is to use the top cone 1 (height 4, radius 3) and the bottom cone 0 (height 5, radius 5).
2)
    
{3}
{3}
{1,1}
{2,4}
Returns: 1

3)
    
{10,10}
{2,5}
{2,9}
{3,6}
Returns: 2

4)
    
{3,4,5}
{5,4,3}
{3,4,5}
{3,8,5}
Returns: 2

5)
    
{1,2,3,4,5}
{2,3,4,5,6}
{2,3,4,5,6}
{1,2,3,4,5}
Returns: 0

6)
    
{123,214,232,323,342,343}
{123,123,232,123,323,434}
{545,322,123,545,777,999}
{323,443,123,656,767,888}
Returns: 5

7)
    
{999,999,999,10000,10000,10000}
{10000,10000,10000,1,2,3}
{2324,2323,234,5454,323,232}
{1,2,3222,434,5454,23}
Returns: 3


This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.





题意:一个hat由上面top cone和下面的bottom cone组成。给定上面cone的高和底半径,topHeigh[],topRadius[]下面cone的bottomHeight[],bottomRadius[]
         上下两个cone组成hat需要满足条件:
                  1:The apex of the top cone must be strictly above the apex of the bottom cone. I.e., when the top cone is placed on top of the bottom cone and released, their apexes must not touch.
                  2:Some part of the bottom cone must remain visible to form the brim of the hat. (Otherwise, the hat would look like a simple cone, not like a wizard hat!)


思路:求二分图的最大匹配,模版题。
         topcone 和bottomcone满足的条件是:topR<bottomR && topR*bottomH<topH*bottomR

错误提交了一次,尼玛!!!犹豫不决不敢coding不行呀!!

175.22pt
              
#include<stdio.h>
#include
<string>
#include
<vector>
#include
<algorithm>
using namespace std;
bool map[55][55];
int result[55];
bool state[55];
int n,m;
class PointyWizardHats{
public:
    
int find(int x)
    {
        
int i;
        
for (i=0;i<m ;i++ )
        {
            
if (map[x][i]==1 && !state[i])
            {
                state[i]
=1;
                
if (result[i]==-1 || find(result[i]))
                {
                    result[i]
=x;
                    
return 1;
                }
            }
        }
        
return 0;
    }
    
bool can(int x1,int y1,int x2,int y2) //这个条件我犹豫了半天,thinking不够啊!
    {
        
if (y2*x1>y1*x2 && y2>y1)
            
return 1;
        
return 0;
    }
    
int getNumHats(vector <int> topHeight, vector <int> topRadius, vector <int> bottomHeight, vector <int> bottomRadius){

        
int i,j;
        
int ans;
        n
=topHeight.size();
        m
=bottomHeight.size();
        memset(map,
0,sizeof(map));
        
for (j=0;j<m;j++)
            result[j]
=-1;    //这里之前全部设置的0啊啊啊!!!
        
for (i=0;i<n;i++)
            
for (j=0;j<m;j++)
                
if (can(topHeight[i],topRadius[i],bottomHeight[j],bottomRadius[j]))
                    map[i][j]
=1;
        ans
=0;
        
for (i=0;i<n;i++)
        {
            memset(state,
0,sizeof(state));
            
if (find(i))
                ans
++;
        }
        
return ans;
    }
};



posted on 2012-07-10 09:14 wangs 阅读(222) 评论(0)  编辑 收藏 引用 所属分类: Topcoder


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理