多校联合比赛总结(四)

第四场比赛早就做完了,就是一直没写总结,感觉这次的题出的真的不好,后台测试数据的强弱就不说了,因为我们也没做出几道题,但是就给出的标准输出都是错的这一点来说真的不怎么样。还有感觉这次的题偏重于数学类的,让人摸不透出题人到底是想考察什么的,晕啊~

这次比赛我们队共做出三题吧,最后那题还是ZJH随手写的,以为一定会超时的,在最后两分钟提交的,唉,这能说什么呢,RP吧~

说说第四题吧,题意是给出一个人5*N的矩阵,让你从矩阵的每行去一个数,是的这五个数的和0,N为200 ,刚开始的时候,ZJH用二分查找做的,怎么样都过不了,后来想想或许Hash查找会快一点,然后改用Hash做的。

代码:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define N 205
#define M 40004
using namespace std ;

long long dat[5][N] , map[2][M] ;

long long cal( int i , int j , int k )
{
    return ( map[0][j] + map[1][k-1] + dat[4][i] );
}

int main()
{
    int cas , n , i , j , k ;
    long long x ;

    scanf( "%d" , &cas );
    while( cas-- )
    {
        scanf( "%d" , &n );
        for ( i = 0 ; i < 5 ; i++ )
        {
            for( j = 0 ; j < n ; j++ )
            cin>>dat[i][j];
        }
        int np = n * n ;
        for( i = 0 ; i < 2 ; i++ )
        {
            for ( j = 0 ; j < n ; j++ )
            {
                for ( k = 0 ; k < n ; k++ )
                map[i][j*n+k] = dat[2*i][j] + dat[2*i+1][k] ;
            }
            sort( map[i] ,  map[i] + np );
        }
        //sort( dat[4] , dat[4] + n );
        int flag = 0 ;
        for ( i = 0 ; i < n && !flag ; i++ )
        {
            k = np - 1 ;
            for( j = 0 ; j < np && !flag ; j++ )
            {
                while( k > 0 && cal ( i , j , k-1 ) >= 0 )
                k--;
                if ( cal ( i , j , k ) == 0 )
                flag = 1 ;
            }
        }
        if ( flag )
        printf ( "Yes\n" );
        else
        printf ( "No\n" );
    }
    return 0 ;
}

然后就是第六题了,纯数学啊,一直没弄懂给出的样例是怎么得到的,赛后看了解题报告,哭了,真心没研究过容斥原理啊,好吧,直接用公式吧~

代码:

View Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define N 25
using namespace std ;

double p[N] , sum , ans ;
int n ;
void dfs( int index , int flag )
{
    if ( index == n )
    return ;
    sum += p[index] ;
    if ( flag )
    ans += 1.0 / sum ;
    else
    ans -= 1.0 / sum ;
    dfs( index + 1 , !flag );
    sum -= p[index] ;
    dfs( index + 1 , flag );
    return ;
}

int main()
{
    while( scanf( "%d" , &n ) != EOF )
    {
        for( int i = 0 ; i < n ; i++ )
        {
            scanf( "%lf" , &p[i] );
        }
        sum = 0.0 ;ans = 0.0 ;
        dfs( 0 , 1 );
        printf ( "%lf\n" , ans ) ;
    }
    return 0 ;
}

其他题没细研究,以后练到了再拿来练手吧~

posted @ 2012-08-06 11:26  Misty_1  阅读(189)  评论(0编辑  收藏  举报