noip 2015 提高组
算是填个坑吧 , QwQ
Day 1
第一题很水,就是考代码能力 ,直接贴代码。
#include <iostream> #include <cstdlib> #include <cstdio> << , maxn = ; using namespace std ; int n , jv[maxn][maxn] ; inline void Init( ) { freopen( "magic.in" , "r" , stdin ) ; freopen( "magic.out" , "w" , stdout ) ; } int read( ) { , ret = ; ; ch = getchar( ) ; } + ch - ' , ch = getchar( ) ; return ret * k ; } void sov( ) { , y = (+n)>> ; jv[x][y] = ; ; i <= n*n ; ++i ) { && y != n ) { jv[n][y+] = i ; x = n ; ++y ; continue ; } ) { jv[x-][] = i ; --x ; y = ; continue ; } && y == n ) { jv[x+][y] = i ; ++x ; continue ; } else { ][y+] ) { jv[x-][y+] = i ; --x ; ++y ; continue ; } jv[x+][y] = i ; ++x ; continue ; } } } void output( ) { ; x <= n ; ++x ) { ; y <= n ; ++y ) printf( "%d " , jv[x][y] ) ; printf( "\n" ) ; } } int main( ) { Init( ) ; n = read( ) ; sov( ) ; output( ) ; fclose( stdin ) ; fclose( stdout ) ; ; }
第二题
就是求一个有向图的最小正环 , 但分析后就知道每个点只有一个出度 ,所以图中只存在简单环 ,
于是我在考场上用并查集做的 。
#include <iostream> #include <cstdlib> #include <cstdio> << , maxn = + ; using namespace std ; ] ; //father and dis inline void Init( ) { freopen( "message.in" , "r" , stdin ) ; freopen( "message.out" , "w" , stdout ) ; } int read( ) { , ret = ; ; ch = getchar( ) ; } + ch - ' , ch = getchar( ) ; return ret * k ; } int find( int x ) { ] == x ) return x ; ] ; fa[x][] = find( fa[x][] ) ; fa[x][] += fa[fu][] ; ] ; } void sov( ) { ; x <= n ; ++x ) fa[x][] = x ; int y , root1 , root2 , ans = inf ; ; x <= n ; ++x ) { y = read( ) ; root1 = find( x ) , root2 = find( y ) ; if( root1 != root2 ) { fa[root1][] = root2 ; fa[root1][] += + fa[y][] ; } else ans = min( ans , fa[x][] + fa[y][] + ) ; } printf( "%d\n" , ans ) ; } int main( ) { Init( ) ; n = read( ) ; sov( ) ; fclose( stdin ) ; fclose( stdout ) ; ; }
后面是先拓扑去不是环里的点,在找最小的环(对每个点打标记,打个标记的点不用遍历。)
#include <iostream> #include <cstdlib> #include <cstdio> #include <queue> << , maxn = + ; using namespace std ; queue < int > Q ; struct id { int nxt , in ; bool vis ; } node[maxn] ; ; inline void Init( ) { freopen( "message.in" , "r" , stdin ) ; freopen( "message.out" , "w" , stdout ) ; } int read( ) { , ret = ; ; ch = getchar( ) ; } + ch - ' , ch = getchar( ) ; return ret * k ; } void input( ) { n = read( ) ; ; x <= n ; ++x ) node[x].nxt = read( ) , node[node[x].nxt].in++ ; } void sov( ) { ; x <= n ; ++x ) if( !node[x].in ) { Q.push( x ) ; node[x].vis = true ; } while( !Q.empty( ) ) { int u = Q.front( ) ; Q.pop( ) ; int v = node[u].nxt ; ) { Q.push( v ) ; node[v].vis = true ; } } ans = inf ; ; x <= n ; ++x ) { , j = node[x].nxt ; if( !node[x].vis ) { while( j != x ) { cnt++ ; node[j].vis = true ; j = node[j].nxt ; } ans = min( ans , cnt ) ; } } printf( "%d\n" , ans ) ; } int main( ) { Init( ) ; input( ) ; sov( ) ; fclose( stdin ) ; fclose( stdout ) ; ; }
当然可以用tajan但我tajan最多只改到90分,就暴栈了QwQ ,不过改成bfs还是可以过,但我没写过 。
第三题就是搜索+剪枝,最开始我以为顺子越长越好,其实并不是QwQ,所以就只有45分 , 然后我就改成枚举了一下顺子的长度,然后就过了。
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #define fo(a,b,c) for(int a=(b);a<=(c);a++) << ; using namespace std ; ] , c[] , ans ; inline void Init( ) { freopen( "landlords.in" , "r" , stdin ) ; freopen( "landlords.out" , "w" , stdout ) ; } int read( ) { , ret = ; ; ch = getchar( ) ; } + ch - ' , ch = getchar( ) ; return ret * k ; } void input( ) { int a , b ; fo( i , , n ) { a = read( ) , b = read( ) ; ) a = ; else if( a ) a-- ; s[a] ++ ; } } int quer( ) { memset( c , , sizeof( c ) ) ; fo( i , , ) c[s[i]] ++ ; // cout<<c[1]<<" "<<c[2]<<" "<<c[3]<<" "<<c[4]<<endl; ; ] && c[]> ) c[]-- , c[] -= , tot ++ ; ] && c[] > ) c[] -- , c[] -= , tot ++ ; ] && c[] ) c[]-- , c[] -- , tot ++ ; ] && c[] ) c[]-- , c[]-- , tot ++ ; ] && c[] ) c[]-- , c[]-- , tot++ ; ] + c[] + c[] + c[] ; } void dfs( int now ) { if( now >= ans ) return ; int tmp = quer( ) ; if( tmp + now < ans ) ans = now + tmp ; fo( i , , ) { int j = i ; ) ++j ; ) { fo( j2 , i+ , j- ) { fo( k , i , j2 ) s[k] -= ; dfs( now + ) ; fo( k , i , j2 ) s[k] += ; } } } fo( i , , ) { int j = i ; ) ++j ; ) { fo( j2 , i+ , j- ) { fo( k , i , j2 ) s[k] -= ; dfs( now + ) ; fo( k , i , j2 ) s[k] += ; } } } fo( i , , ) { int j = i ; ) ++j ; ) fo( j2 , i+ , j- ) { fo( k , i , j2 ) --s[k] ; dfs( now + ) ; fo( k , i , j2 ) ++s[k] ; } } return ; } int main( ) { Init( ) ; t = read( ) , n = read( ); while( t-- ) { memset( s , , sizeof(s) ) ; // memset( c , 0 , sizeof(c) ) ; ans = inf ; input( ) ; dfs( ) ; printf( "%d\n" , ans ) ; } fclose( stdin ) ; fclose( stdout ) ; ; }
day2
第一题比较简单,就是一个二分嘛 ,虽然昨年没写出来qwq(昨年用堆贪心)
#include <iostream> #include <cstdlib> #include <cstdio> << , maxn = + ; using namespace std ; int l , n , m , a[maxn] ; inline void Init( ) { freopen( "stone.in" , "r" , stdin ) ; freopen( "stone.out" , "w" , stdout ) ; } int read( ) { , ret = ; ; ch = getchar( ) ; } + ch - ' , ch = getchar( ) ; return ret * k ; } void input( ) { l = read( ) , n = read( ) , m = read( ) ; ; x <= n ; ++x ) a[x] = read( ) ; a[n+] = l , ++n ; } bool check( int len ) { , ans = ; ; x <= n ; ++x ) { if( a[x] - last < len ) ans++ ; else last = a[x] ; if( ans > m ) return false ; } return true ; } void sov( ) { , rr = l ; while( ll <= rr ) { ; ; ; } printf( ) ; } int main( ) { Init( ) ; input( ) ; sov( ) ; fclose( stdin ) ; fclose( stdout ) ; ; }
第二题的话,就是方程式比较难推,QwQ我考场上写的记搜,结果空间复杂度算错 ,本来还是可以骗一点分的 ,
就是个dp,方程式其实还是比较好推,就是要想到一个前缀优化,然后滚一滚就可以过 。
#include <iostream> #include <cstdlib> #include <cstdio> ; using namespace std ; int n , m , k ; ] , b[] ; ][][][] ; int main( ) { scanf( "%d%d%d" , &n , &m , &k ) ; scanf( , b+ ) ; f[][][][] = , f[][][][] = ; ; i <= n ; ++i ) { ; j <= min( i , m) ; ++j ) { ; l <= k ; ++l ) { ,last=(i-)&; if( a[i] == b[j] ) { f[j][l][][now] = ( f[j-][l-][][last] + f[j-][l-][][last] ) % mod + f[j-][l][][last] ; f[j][l][][now] %= mod ; f[j][l][][now] = ( f[j][l][][last] + f[j][l][][last] ) % mod ; } else { f[j][l][][now] = (f[j][l][][last]+f[j][l][][last])%mod ; f[j][l][][now] = ; } // cout<<j<<" "<<l<<" "<<now<<" "<<f[j][l][1][now]<<" "<<f[j][l][0][now]<<endl; } } } printf( ][n&]+f[m][k][][n&])%mod ) ; ; }
noip 2015 提高组的更多相关文章
- NOIP 2015提高组复赛
神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第 ...
- NOIP 2015 提高组 Day2
期望得分:100+10+60=170 实际得分:100+10+35=145 http://www.cogs.pro/cogs/page/page.php?aid=16 T1 跳石头 时间限制:1 s ...
- NOIP 2015 提高组 Day1
期望得分:100+100+100=300 实际得分:100+100+45=245 T3 相似的代码 复制过去 没有改全,痛失55分 http://www.cogs.pro/cogs/page/page ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】
/*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- 最优贸易 NOIP 2009 提高组 第三题
题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...
- NOIP 2006 提高组 t1 能量项链
题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定 ...
随机推荐
- php内存管理
1.为什么需要内存管理 由于计算机的内存由操作系统进行管理,所以普通应用程序是无法直接对内存进行访问的, 应用程序只能向操作系统申请内存,通常的应用也是这么做的,在需要的时候通过类似malloc之类的 ...
- JS将搜索的关键字高亮显示实现代码
这篇文章介绍了JS将搜索的关键字高亮显示实现代码,有需要的朋友可以参考一下 用JS让文章内容指定的关键字加亮 是这样的.. 现在有这些关键字:美容,生活,购物 当在文章里头出现这些关键字,就把它加亮显 ...
- (转载)delphi中获取汉字的拼音首字母
delphi中获取汉字的拼音首字母1.py: array[216..247] of string = ({216}'CJWGNSPGCGNESYPB' + 'TYYZDXYKYGTDJNMJ' + ' ...
- python 数据字典应用
一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器 ...
- 程序员老鸟写sql语句的经验之谈
做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...
- sql server2005主从数据库同步配置
网站规模到了一定程度之后,该分的也分了,该优化的也做了优化,但是还是不能满足业务上对性能的要求:这时候我们可以考虑使用主从库.主从库是两台服务器上的两个数据库,主库以最快的速度做增删改操作+最新数据的 ...
- Intel项目Java小记
cannot be cast to javax.servlet.Filter添加provided即可 install -X是什么意思? Unsupported major.minor version ...
- [Jquery] js获取浏览器滚动条距离顶端的距离
需要用js获取滚动条距离窗口顶端的距离和js获取浏览器可视化窗口的大小 一.jQuery获取的相关方法 jquery 获取滚动条高度 获取浏览器显示区域的高度 : $(window).height( ...
- Druid :大数据实时处理的开源分布式系统(1)
引言 Druid 是一个快速,近实时的查询海量只读数据的系统.Druid 的目标是可用性要达到100%,即使在部署新代码,或者某些节点 down 机的情况下. Druid 目前支持的单表查询方式和 D ...
- IntelliJ IDEA SVN的账号修改 信息清除
来到编译器的setting设置 搜索subversion 点击subversion 找到下面的clear auth...按钮,点击一下 就可以了