noip 2015 提高组

算是填个坑吧 , QwQ

Day 1

第一题很水,就是考代码能力 ,直接贴代码。

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 const int inf = 1 << 30 , maxn = 45 ;
 5 using namespace std ;
 6 int n , jv[maxn][maxn] ;
 7 inline void Init( )
 8 {
 9     freopen( "magic.in" , "r" , stdin ) ;
10     freopen( "magic.out" , "w" , stdout ) ;
11 }
12
13 int read( )
14 {
15     char ch = getchar( ) ; int k = 1 , ret = 0 ;
16     while( ch < ‘0‘ || ch > ‘9‘ ) { if( ch == ‘-‘ )k = -1 ; ch = getchar( ) ; }
17     while( ch >= ‘0‘ && ch <= ‘9‘ ) ret = ret * 10 + ch - ‘0‘ , ch = getchar( ) ;
18     return ret * k ;
19 }
20
21
22 void sov(  )
23 {
24     int x = 1 , y = (1+n)>>1 ;
25     jv[x][y] = 1 ;
26     for( int i = 2 ; i <= n*n ; ++i )
27     {
28         if( x == 1 && y != n )
29         {
30             jv[n][y+1] = i ;
31             x = n ; ++y ;
32             continue ;
33         }
34         if( y == n && x != 1 )
35         {
36             jv[x-1][1] = i ;
37             --x ; y = 1 ;
38             continue ;
39         }
40         if( x == 1 && y == n )
41         {
42             jv[x+1][y] = i ;
43             ++x ; continue ;
44         }
45         else
46         {
47             if( !jv[x-1][y+1] )
48             {
49                 jv[x-1][y+1] = i ;
50                 --x ; ++y ;
51                 continue ;
52             }
53             jv[x+1][y] = i ;
54             ++x ; continue ;
55         }
56     }
57 }
58
59 void output( )
60 {
61     for( int x = 1 ; x <= n ; ++x )
62     {
63         for( int y = 1 ; y <= n ; ++y )
64             printf( "%d " , jv[x][y] ) ;
65         printf( "\n" ) ;
66     }
67 }
68
69
70 int main( )
71 {
72     Init( ) ;
73     n = read( ) ;
74     sov( ) ;
75     output( ) ;
76     fclose( stdin ) ;
77     fclose( stdout ) ;
78     return 0 ;
79 }

第二题

就是求一个有向图的最小正环 , 但分析后就知道每个点只有一个初度 ,所以图中只存在简单环 ,

于是我在考场上用并查集做的 。

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 const int inf = 1 << 30 , maxn =  200000 + 11  ;
 5 using namespace std ;
 6 int n , fa[maxn][2] ; //father and dis
 7
 8 inline void Init( )
 9 {
10     freopen( "message.in" , "r" , stdin ) ;
11     freopen( "message.out" , "w" , stdout ) ;
12 }
13
14 int read( )
15 {
16     char ch = getchar( ) ; int k = 1 , ret = 0 ;
17     while( ch < ‘0‘ || ch > ‘9‘ ) { if( ch == ‘-‘ )k = -1 ; ch = getchar( ) ; }
18     while( ch >= ‘0‘ && ch <= ‘9‘ ) ret = ret * 10 + ch - ‘0‘ , ch = getchar( ) ;
19     return ret * k ;
20 }
21
22 int find( int x )
23 {
24     if( fa[x][0] == x ) return x ;
25     int fu = fa[x][0] ;
26     fa[x][0] = find( fa[x][0] ) ;
27     fa[x][1] += fa[fu][1] ;
28     return fa[x][0] ;
29 }
30
31
32 void sov( )
33 {
34     for( int x = 1 ; x <= n ; ++x ) fa[x][0] = x ;
35     int y , root1 , root2 , ans = inf ;
36     for( int x = 1 ; x <= n ; ++x )
37     {
38         y = read( ) ;
39         root1 = find( x ) , root2 = find( y ) ;
40         if( root1 != root2 )
41         {
42             fa[root1][0] = root2 ;
43             fa[root1][1] += 1 + fa[y][1] ;
44         }
45         else
46             ans = min( ans , fa[x][1] + fa[y][1] + 1 ) ;
47     }
48     printf( "%d\n" , ans ) ;
49 }
50
51
52 int main( )
53 {
54     Init( ) ;
55     n = read( ) ;
56     sov( ) ;
57     fclose( stdin ) ;
58     fclose( stdout ) ;
59     return 0 ;
60 }

后面是先拓扑去不是环里的点,在找最小的环(对每个点打标记,打个标记的点不用遍历。)

 1 #include <iostream>
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <queue>
 5 const int inf = 1 << 30 , maxn =  200000 + 11  ;
 6 using namespace std ;
 7 queue < int > Q ;
 8 struct id
 9 {
10     int nxt , in ; bool vis ;
11 } node[maxn] ;
12 int n , ans = 0 ;
13
14 inline void Init( )
15 {
16     freopen( "message.in" , "r" , stdin ) ;
17     freopen( "message.out" , "w" , stdout ) ;
18 }
19
20 int read( )
21 {
22     char ch = getchar( ) ; int k = 1 , ret = 0 ;
23     while( ch < ‘0‘ || ch > ‘9‘ ) { if( ch == ‘-‘ )k = -1 ; ch = getchar( ) ; }
24     while( ch >= ‘0‘ && ch <= ‘9‘ ) ret = ret * 10 + ch - ‘0‘ , ch = getchar( ) ;
25     return ret * k ;
26 }
27
28 void input(  )
29 {
30     n  = read( ) ;
31     for( int x = 1 ; x <= n ; ++x )
32         node[x].nxt = read( ) , node[node[x].nxt].in++ ;
33 }
34
35
36 void sov( )
37 {
38     for( int x = 1 ; x <= n ; ++x ) if( !node[x].in ) { Q.push( x ) ; node[x].vis = true ; }
39     while( !Q.empty( ) )
40     {
41         int u = Q.front( ) ; Q.pop( ) ;
42         int v = node[u].nxt ;
43         if( --node[v].in == 0 ) { Q.push( v ) ; node[v].vis = true ; }
44     } ans = inf ;
45     for( int x = 1 ; x <= n ; ++x )
46     {
47         int cnt = 1 , j = node[x].nxt ;
48         if( !node[x].vis )
49         {
50             while( j != x )
51             {
52                 cnt++ ;
53                 node[j].vis = true ;
54                 j = node[j].nxt ;
55             }
56             ans = min( ans , cnt ) ;
57         }
58
59     }
60     printf( "%d\n" , ans ) ;
61 }
62
63
64 int main( )
65 {
66     Init( ) ;
67     input(  ) ;
68     sov( ) ;
69     fclose( stdin ) ;
70     fclose( stdout ) ;
71     return 0 ;
72 }
时间: 2024-08-29 05:29:42

noip 2015 提高组的相关文章

NOIP 2012 提高组 DAY1 T2 国王游戏

题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍的最前面.排好队后,所有的大臣都会获得国王奖赏的若干金币,每 位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右 手上的数,然后向下取整得到的结果. 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序, 使得获得奖赏最多的大臣,所获奖赏尽可能的少

NOIP 2014 提高组 题解

NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法,直接模拟,别读错题. 1 int wn[5][5]={{2,0,1,1,0}, 2 {1,2,0,1,0}, 3 {0,1,2,0,1}, 4 {0,0,1,2,1}, 5 {1,1,0,0,2}}; 6 7 int n,na,nb; 8 int a[222],b[222]; 9 int s1,s

NOIP 2008提高组第三题题解by rLq

啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是,他们可以通过传纸条来进行交流.纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n).从小渊

NOIP 2006 提高组 t1 能量项链

题目描述 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记.因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量.如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为m*r*n(Mars单位),新产生的珠子的头标

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,000,000,000

模拟(玩具谜题NOIP 2016 提高组 Day 1 第一题vijos2003)

描述 小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉小南一个谜题:“眼镜藏在我左数第3个玩具小人的右数第1个玩 具小人的左数第2个玩具小人那里.” 小南发现,这个谜题中玩具小人的朝向非常关键,因为朝内和朝外的玩具小人的左右方向是相反的:面朝圈内的玩具小人,它的左边是顺时针方向,右边是逆时针方向:而面向圈外的玩具小人,它的左边是逆时针方向,右边是顺时针方向. 小

NOIP 2002提高组 选数 dfs/暴力

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素

noip 2016 提高组试题看法

前几天写的那个纯属搞笑.(额,好吧,其实这个也不怎么正经) 就先说说day2吧: T1:这个东西应该叫做数论吧. 然而我一看到就照着样例在纸上推了大半天(然而还是没有看出来这东西是个杨辉三角) 然后就想干脆先把n≤25的拿了再说(这个爆不了long long) 然后就硬套用那个组合数公式. 再然后,就只拿了35分. T2:我勒个去. 这个东西应该用堆来优化的吧. 然而并不会堆. 然后就切一个遍历一遍把两端都再加进去(虽然我知道这个时间复杂度估计连20都拿不了). 一个估计是正解的东西: 思考一下

NOIP 2013 提高组 day2 积木大赛 找拐点

积木大赛 描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第??块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 n 块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[L,R],然后将第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1. 小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手的孩