不解释,很简单,直接按照题目的方法构造就行了

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<map>
  6. #include<set>
  7. #include<queue>
  8. #include<vector>
  9. #include<algorithm>
  10. using namespace std;
  11. typedef bool boolean;
  12. template<typename T>
  13. inline void readInteger(T& u){
  14. char x;
  15. while(!isdigit((x = getchar())));
  16. for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
  17. ungetc(x, stdin);
  18. }
  19.  
  20. template<typename T>class Matrix{
  21. public:
  22. T* p;
  23. int width;
  24. int height;
  25. Matrix():width(), height(){}
  26. Matrix(int width, int height):width(width), height(height){
  27. p = new T[width * height];
  28. }
  29. T* operator [](int pos){
  30. return p + pos * width;
  31. }
  32. };
  33.  
  34. int n;
  35. Matrix<int> hf;
  36. int lx, ly;
  37.  
  38. inline void init(){
  39. readInteger(n);
  40. hf = Matrix<int>(n + , n + );
  41. }
  42.  
  43. inline void solve(){
  44. memset(hf.p, , sizeof(int) * (n + ) * (n + ));
  45. hf[][n / + ] = ;
  46. lx = , ly = n / + ;
  47. for(int k = ; k <= n * n; k++){
  48. if(lx == && ly != n){
  49. lx = n;
  50. ly++;
  51. }else if(ly == n && lx != ){
  52. ly = ;
  53. lx--;
  54. }else if(ly == n && lx == ){
  55. lx++;
  56. }else if(hf[lx - ][ly + ] == ){
  57. lx--;
  58. ly++;
  59. }else{
  60. lx++;
  61. }
  62. hf[lx][ly] = k;
  63. }
  64. for(int i = ; i <= n; i++){
  65. for(int j = ; j <= n; j++){
  66. printf("%d ", hf[i][j]);
  67. }
  68. putchar('\n');
  69. }
  70. }
  71.  
  72. int main(){
  73. freopen("magic.in", "r", stdin);
  74. freopen("magic.out", "w", stdout);
  75. init();
  76. solve();
  77. return ;
  78. }


  直接Tarjan,当然也可以直接用深搜(貌似要比Tarjan快一点,其实思路还是差不多的)

Code(Tarjan)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<map>
  6. #include<set>
  7. #include<stack>
  8. #include<queue>
  9. #include<vector>
  10. #include<algorithm>
  11. using namespace std;
  12. typedef bool boolean;
  13. template<typename T>
  14. inline void readInteger(T& u){
  15. char x;
  16. while(!isdigit((x = getchar())));
  17. for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
  18. ungetc(x, stdin);
  19. }
  20. #define smin(a, b) a = min(a, b)
  21.  
  22. typedef class Edge{
  23. public:
  24. int next;
  25. int end;
  26. Edge(const int next = , const int end = ):next(next), end(end){}
  27. }Edge;
  28.  
  29. typedef class MapManager{
  30. public:
  31. int *h;
  32. Edge *edge;
  33. int ce;
  34. MapManager():h(NULL), edge(NULL), ce(){}
  35. MapManager(int points, int edges):ce(){
  36. h = new int[(const int)(points + )];
  37. edge = new Edge[(const int)(edges + )];
  38. memset(h, , sizeof(int) * (points + ));
  39. }
  40. inline void addEdge(int from, int end){
  41. edge[++ce] = Edge(h[from], end);
  42. h[from] = ce;
  43. }
  44. }MapManager;
  45.  
  46. #define m_begin(g, i) (g).h[(i)]
  47. #define m_next(g, i) (g).edge[(i)].next
  48. #define m_end(g, i) (g).edge[(i)].end
  49.  
  50. int *uf;
  51. int cn;
  52. stack<int> s;
  53. int *visitID;
  54. int *exitID;
  55. boolean* visited;
  56. boolean* inStack;
  57. MapManager g;
  58. int result;
  59.  
  60. inline void getSonMap(int end){
  61. int counter = ;
  62. int buf = s.top();
  63. int first = buf;
  64. s.pop();
  65. inStack[buf] = false;
  66. while(buf != end){
  67. buf = s.top();
  68. s.pop();
  69. inStack[buf] = false;
  70. uf[buf] = first;
  71. counter++;
  72. }
  73. if(counter > )
  74. smin(result, counter);
  75. }
  76.  
  77. void Tarjan(int node){
  78. visitID[node] = exitID[node] = ++cn;
  79. visited[node] = true;
  80. inStack[node] = true;
  81. s.push(node);
  82. for(int i = m_begin(g, node); i != ; i = m_next(g, i)){
  83. int& e = m_end(g, i);
  84. if(!visited[e]){
  85. Tarjan(e);
  86. exitID[node] = min(exitID[node], exitID[e]);
  87. }else if(inStack[e]){
  88. exitID[node] = min(exitID[node], visitID[e]);
  89. }
  90. }
  91. if(exitID[node] == visitID[node]){
  92. getSonMap(node);
  93. }
  94. }
  95.  
  96. int n;
  97.  
  98. inline void init(){
  99. readInteger(n);
  100. g = MapManager(n, n);
  101. uf = new int[(const int)(n + )];
  102. visitID = new int[(const int)(n + )];
  103. exitID = new int[(const int)(n + )];
  104. inStack = new boolean[(const int)(n + )];
  105. visited = new boolean[(const int)(n + )];
  106. memset(visited, false, sizeof(boolean) * (n + ));
  107. memset(inStack, false, sizeof(boolean) * (n + ));
  108. for(int i = , a; i <= n; i++){
  109. readInteger(a);
  110. uf[i] = i;
  111. g.addEdge(i, a);
  112. }
  113. }
  114.  
  115. inline void solve(){
  116. result = 0xfffffff;
  117. for(int i = ; i <= n; i++)
  118. if(!visited[i])
  119. Tarjan(i);
  120. delete[] visitID;
  121. delete[] exitID;
  122. printf("%d", result);
  123. }
  124.  
  125. int main(){
  126. freopen("message.in", "r", stdin);
  127. freopen("message.out", "w", stdout);
  128. init();
  129. solve();
  130. return ;
  131. }

Tarjan

  dfs的话就记一个访问的时间戳,还要即一个是否在栈中,当时间戳不为初值并且在栈中才说明是环

Code(Dfs)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #define smin(a, b) a = min(a, b)
  6. using namespace std;
  7. typedef bool boolean;
  8. template<typename T>
  9. inline void readInteger(T& u){
  10. char x;
  11. while(!isdigit((x = getchar())));
  12. for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
  13. ungetc(x, stdin);
  14. }
  15. int n;
  16. int timec;
  17. int* next;
  18. int* rank;
  19. boolean* inStack;
  20. int result = 0xfffffff;
  21. void find(int node){
  22. if(rank[node] != - && inStack[node]){
  23. smin(result, ++timec - rank[node]);
  24. return;
  25. }
  26. if(rank[node] != - ) return;
  27. inStack[node] = true;
  28. rank[node] = ++timec;
  29. find(next[node]);
  30. inStack[node] = false;
  31. }
  32. int main(){
  33. freopen("message.in", "r", stdin);
  34. freopen("message.out", "w", stdout);
  35. readInteger(n);
  36. next = new int[(const int)(n + )];
  37. rank = new int[(const int)(n + )];
  38. inStack = new boolean[(const int)(n + )];
  39. memset(rank, -, sizeof(int) * (n + ));
  40. for(int i = ; i <= n; i++){
  41. readInteger(next[i]);
  42. inStack[i] = false;
  43. }
  44. for(int i = ; i <= n; i++){
  45. if(rank[i] == -)
  46. find(i);
  47. }
  48. printf("%d", result);
  49. return ;
  50. }

Dfs



  思路很简单,搜!不过如果对子、三带一都去搜的话很耗时间,也很耗代码,而且它们是可以直接算出来的

稍微贪一下心,把能带走的都带走,而且从多的开始带。但是双王要记住特殊处理

  搜的内容就只包括顺子,只不过注意所有情况都要搜到,因为某些数据顺子即使搜得长,并不是最优的,反

而导致单牌过多。其他都还是没有什么特别坑的细节。

Code

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cstring>
  5. #include<map>
  6. #include<set>
  7. #include<queue>
  8. #include<vector>
  9. #include<algorithm>
  10. #define smin(a, b) a = min(a, b)
  11. using namespace std;
  12. typedef bool boolean;
  13. template<typename T>
  14. inline void readInteger(T& u){
  15. char x;
  16. while(!isdigit((x = getchar())));
  17. for(u = x - ''; isdigit((x = getchar())); u = (u << ) + (u << ) + x - '');
  18. ungetc(x, stdin);
  19. }
  20.  
  21. int n;
  22. int kase;
  23. int key[] = {, , , , , , , , , , , , , };
  24. int had[];
  25.  
  26. inline void init(){
  27. memset(had, , sizeof(had));
  28. for(int i = , a, b; i <= n; i++){
  29. readInteger(a);
  30. readInteger(b);
  31. if(a == ) had[ + b]++;
  32. else had[key[a]]++;
  33. }
  34. }
  35.  
  36. int calc(){
  37. int counter[] = {, , , , };
  38. for(int i = ; i <= ; i++){
  39. if(had[i] > ){
  40. counter[had[i]]++;
  41. }
  42. }
  43. int reter = ;
  44. boolean aFlag = ;
  45. if(had[] == && had[] == ){
  46. aFlag = ;
  47. }
  48. while(counter[] && counter[] >= ) reter++, counter[] -= , counter[] -= ;
  49. while(counter[] && counter[] >= ) reter++, counter[] -= , counter[] -= ;
  50. while(counter[] && counter[]) reter++, counter[] -= , counter[] -= ;
  51. while(counter[] && counter[]) reter++, counter[] -= , counter[] -= ;
  52. while(counter[] && counter[]) reter++, counter[] -= , counter[] -= ;
  53. if(counter[] >= && aFlag) counter[] -= ;
  54. return reter + counter[] + counter[] + counter[] + counter[];
  55. }
  56.  
  57. int result;
  58. void search(int last, int times){
  59. if(last == ){
  60. smin(result, times);
  61. return;
  62. }
  63. smin(result, times + calc());
  64. if(times >= result) return;
  65. //顺子
  66. if(last >= ){
  67. for(int p = ; p >= ; p--){
  68. for(int i = ; i <= ; i++){
  69. int k = i;
  70. while(had[k] >= p && k < ) k++;
  71. if((k - i) * p >= ){
  72. for(int j = i; j < k; j++){
  73. had[j] -= p;
  74. }
  75. for(int j = k - ; j >= i; j--){
  76. if((j - i + ) * p >= )
  77. search(last - (j - i + ) * p, times + );
  78. had[j] += p;
  79. }
  80. }
  81. }
  82. }
  83. }
  84. }
  85.  
  86. int main(){
  87. freopen("landlords.in", "r", stdin);
  88. freopen("landlords.out", "w", stdout);
  89. readInteger(kase);
  90. readInteger(n);
  91. while(kase--){
  92. init();
  93. result = n;
  94. search(n, );
  95. printf("%d\n", result);
  96. }
  97. return ;
  98. }

  

noip2015 day1的更多相关文章

  1. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

  2. 信息传递--NOIP2015 day1 T2--暴力

    这道题我用了判联通量加暴力,但联通量判炸了....然后从code[VS]上看到个不错的代码,就拿来了^_^... 基本思路是去掉环外的点,然后走每一个联通块. #include <iostrea ...

  3. 【 NOIP2015 DAY1 T2 信息传递】带权并查集

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  4. 【NOIP2015 DAY1 T3 】斗地主(landlords)

    题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游戏.在斗地主中,牌的大小关系根据牌的数码表示如下:3<4< ...

  5. 斗地主 (NOIP2015 Day1 T3)

    斗地主 张牌,因为它可以连在K后, 总体思路为 先出炸弹和四带二 再出三带一 再把对牌和单牌出完 记录并更新Answer,后枚举顺子,并继续向下搜索. 注意:弄明白题意,题目描述不太清楚....另外, ...

  6. 洛谷P2661 信息传递==coedevs4511 信息传递 NOIP2015 day1 T2

    P2661 信息传递 题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知 ...

  7. 东方14模拟赛之noip2015/day1/3/神奇的幻方

    总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  128000kB 描述 幻方是一种很神奇的N*N 矩阵:它由数字 1,2,3, … …,N*N 构成,且每行.每列及 ...

  8. 信息传递 NOIP2015 day1 T2

    题文: 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一轮 ...

  9. noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

    T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为 ...

随机推荐

  1. 【python+opencv】直线检测+圆检测

     Python+OpenCV图像处理—— 直线检测 直线检测理论知识: 1.霍夫变换(Hough Transform) 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进 ...

  2. 启动InnoDB引擎的方法

    启动InnoDB引擎的方法 http://down.chinaz.com/server/201207/2090_1.htm 启动InnoDB引擎的方法 Mysql中默认的是MyISAM数据引擎,可惜此 ...

  3. [git]git版本管理学习记录

    今天看到别人用这玩意记录自己的进度, 我也学习了一下. 1,适当的工具会提升效率 2,关注点还是得放在代码本身上. github/gitignore github提供了各种gitignore文件 有p ...

  4. KMP(http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2772)

    #include <stdio.h>#include <string.h>#include <stdlib.h>char a[1000001],b[1000001] ...

  5. openstack 部署笔记--keystone

    控制节点 安装keystone包 # yum install openstack-keystone httpd mod_wsgi keystone配置文件 # vim /etc/keystone/ke ...

  6. ID和Name

    ID和Name都可以用来标识一个标记,Javascript分别有两个方法getElementById和getElementByName来定位Dom节点. 区别如下: 1.我们知道在网页做Post提交时 ...

  7. linux 启动引导流程

    课程大纲: Linux引导流程 Linux运行级别 Linux启动服务管理 GRUB配置与应用 启动故障分析与解决 系统引导流程 1.固件firmware(CMOS(固化在硬件上的程序与硬件统称)/B ...

  8. reduce()方法

    1.reduce()方法概述 reduce方法有两个参数,第一个参数是一个callback,用于针对数组项的操作:第二个参数则是传入的初始值,这个初始值用于单个数组项的操作.需要注意的是,reduce ...

  9. JS中的对象数组

    <html> <head> <title>对象数组的字符串表示</title> <script type="text/javascrip ...

  10. 服务器修改用户密码注意iis部署的网站问题

    当服务器修改用户密码时,需要修改iis上部署的跟此用户权限有关的所有网站,选择网站——右击——应用程序管理——高级设置——物理路径凭证——特定用户——修改用户名和密码.