第四场比赛早就做完了,就是一直没写总结,感觉这次的题出的真的不好,后台测试数据的强弱就不说了,因为我们也没做出几道题,但是就给出的标准输出都是错的这一点来说真的不怎么样。还有感觉这次的题偏重于数学类的,让人摸不透出题人到底是想考察什么的,晕啊~
这次比赛我们队共做出三题吧,最后那题还是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 ; }
其他题没细研究,以后练到了再拿来练手吧~