HDOJ 5090

水题。从小到大排序,能够填充达到符合条件的。先填充好。填充之后进行调整。

传送门:

pid=5090">点击打开链接

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <map>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int MAXN = 1e2+10;
  11. int t, n, k, ia[MAXN];
  12.  
  13. int main()
  14. {
  15. scanf("%d", &t);
  16. while(t--)
  17. {
  18. scanf("%d%d", &n, &k);
  19. bool flag = true;
  20. for(int i=1; i<=n; ++i)
  21. {
  22. scanf("%d", ia+i);
  23. }
  24. sort(ia+1, ia+n+1);
  25. for(int i=1; i<=n; ++i)
  26. {
  27. if(i < ia[i])
  28. {
  29. flag = false;
  30. break;
  31. }
  32. if(i == ia[i])
  33. {
  34. continue;
  35. }
  36. if(0 == (i-ia[i])%k)
  37. {
  38. ia[i] = i;
  39. }
  40. else
  41. {
  42. int tp = 1;
  43. for(int j=i+1; j<=n; ++j)
  44. {
  45. if(0 == (j-ia[i])%k)
  46. {
  47. ia[i] = j;
  48. tp = 0;
  49. --i;
  50. break;
  51. }
  52. }
  53. if(tp)
  54. {
  55. flag = false;
  56. break;
  57. }
  58. }
  59. sort(ia+1, ia+n+1);
  60. }
  61. printf("%s\n", flag ?
  62.  
  63. "Jerry" : "Tom");
  64. }
  65. return 0;
  66. }

HDOJ 5092

题意:每行取一个数。使总和最小,取了mp[i][j]之后,仅仅能在该点左下,正下。右下三个位置里面取下一个点。记录路径。要注意尽量靠右。

分析:一个典型的dp

传送门:点击打开链接

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <map>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int MAXN = 1e2+10;
  11. const int INF = 0x7fffffff;
  12. int t, m, n, dp[MAXN][MAXN];
  13. int s[MAXN][MAXN], mp[MAXN][MAXN], icase = 1;
  14.  
  15. void output(int i, int j)
  16. {
  17. if(0 == i)
  18. {
  19. return ;
  20. }
  21. if(1 == s[i][j])
  22. {
  23. output(i-1, j-1);
  24. printf("%d ", j-1);
  25. }
  26. else if(2 == s[i][j])
  27. {
  28. output(i-1, j);
  29. printf("%d ", j);
  30. }
  31. else if(3 == s[i][j])
  32. {
  33. output(i-1, j+1);
  34. printf("%d ", j+1);
  35. }
  36. }
  37.  
  38. int main()
  39. {
  40. scanf("%d", &t);
  41. while(t--)
  42. {
  43. scanf("%d%d", &n, &m);
  44. memset(dp, 0, sizeof(dp));
  45. memset(mp, 0, sizeof(mp));
  46. memset(s, 0, sizeof(s));
  47. for(int i=1; i<=n; ++i)
  48. {
  49. for(int j=1; j<=m; ++j)
  50. {
  51. scanf("%d", &mp[i][j]);
  52. }
  53. }
  54. for(int i=1; i<=m; ++i)
  55. {
  56. dp[1][i] = mp[1][i];
  57. }
  58. for(int i=2; i<=n; ++i)
  59. {
  60. for(int j=1; j<=m; ++j)
  61. {
  62. int mn = INF;
  63. if(j>=2 && dp[i-1][j-1] <= mn)
  64. {
  65. mn = dp[i-1][j-1];
  66. s[i][j] = 1;
  67. }
  68. if(dp[i-1][j] <= mn)
  69. {
  70. mn = dp[i-1][j];
  71. s[i][j] = 2;
  72. }
  73. if(j<=m-1 && dp[i-1][j+1] <= mn)
  74. {
  75. mn = dp[i-1][j+1];
  76. s[i][j] = 3;
  77. }
  78. dp[i][j] = mn + mp[i][j];
  79. }
  80. }
  81. int mn = INF, id = 0;
  82. for(int i=1; i<=m; ++i)
  83. {
  84. if(dp[n][i] <= mn)
  85. {
  86. mn = dp[n][i];
  87. id = i;
  88. }
  89. }
  90. /*
  91. printf("%d\n", mn);
  92. for(int i=1; i<=n; ++i)
  93. {
  94. for(int j=1; j<=m; ++j)
  95. {
  96. printf("%d ", dp[i][j]);
  97. }
  98. printf("\n");
  99. }
  100. */
  101. printf("Case %d\n", icase++);
  102. output(n, id);
  103. printf("%d\n", id);
  104. }
  105. return 0;
  106. }

HDOJ 5093

分析:二分图。

队友写的,没细看,贴个队友的代码。之后有空再看。

传送门:

pid=5093">点击打开链接

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6. int match[1260];
  7. char map[60][60];
  8. int pic[1260][60];
  9. int vis[1260];
  10. int m,n;
  11. int nx=0,ny[60],nk=0,flag=0,yvis[60];
  12. int dp(int now)
  13. {
  14. int i;
  15. for(i=0;pic[now][i]!=-1;i++)
  16. {
  17. int t=pic[now][i];
  18. if(vis[t]==1)
  19. continue;
  20. vis[t]=1;
  21. if(match[t]==-1||dp(match[t]))
  22. {
  23. match[t]=now;
  24. return 1;
  25. }
  26. }
  27. return 0;
  28. }
  29. int main()
  30. {
  31. //freopen("D:\\in.txt","r",stdin);
  32. int t,i,j;
  33. cin>>t;
  34. while(t--)
  35. {
  36. cin>>m>>n;
  37. for(i=0;i<m;i++)
  38. scanf("%s",map[i]);
  39. memset(yvis,0,sizeof(yvis));
  40. for(i=0;i<n;i++)
  41. ny[i]=i;
  42. nx=nk=0;
  43. flag=0;
  44. memset(pic,-1,sizeof(pic));
  45. for(i=0;i<m;i++)
  46. {
  47. for(j=0;j<n;j++)
  48. {
  49. if(map[i][j]=='*')
  50. {
  51. yvis[j]=1;
  52. pic[nx][flag++]=ny[j];
  53. }
  54. if(map[i][j]=='#')
  55. {
  56. if(flag)
  57. {
  58. nx++;
  59. flag=0;
  60. }
  61. if(yvis[j])
  62. {
  63. ny[j]=n+nk;
  64. nk++;
  65. yvis[j]=0;
  66. }
  67. }
  68. }
  69. if(flag)
  70. {
  71. nx++;
  72. flag=0;
  73. }
  74. }
  75. int ans=0;
  76. memset(match,-1,sizeof(match));
  77. for(i=0;i<=nx;i++)
  78. {
  79. memset(vis,0,sizeof(vis));
  80. if(dp(i))
  81. ans++;
  82. }
  83. cout<<ans<<endl;
  84. }
  85. }

HDOJ 5094

分析:BFS+状压(不然会MLE)。wa点:一个位置可能有几把不同的钥匙。

传送门:点击打开链接

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <map>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int MAXN = 55;
  11. int n, m, p, k, s, mk[MAXN][MAXN];
  12. int vis[1<<11][MAXN][MAXN];
  13. int dir[4][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
  14. struct P
  15. {
  16. int x, y, time, key;
  17. };
  18. map<int, int> mp;
  19.  
  20. int BFS()
  21. {
  22. memset(vis, 0, sizeof(vis));
  23. queue<P> que;
  24. P s; s.x = s.y = 1;
  25. s.key = s.time = 0;
  26. if(mk[s.x][s.y])
  27. {
  28. s.key = mk[s.x][s.y];
  29. }
  30. vis[s.key][s.x][s.y] = 1;
  31. que.push(s);
  32. while(!que.empty())
  33. {
  34. P u = que.front();
  35. que.pop();
  36. if(u.x==n && u.y==m)
  37. {
  38. return u.time;
  39. }
  40. for(int i=0; i<4; ++i)
  41. {
  42. P v;
  43. v.x = u.x + dir[i][0];
  44. v.y = u.y + dir[i][1];
  45. if(v.x<1 || v.x>n || v.y<1 || v.y>m)
  46. {
  47. continue;
  48. }
  49. int q = 51*51*51*u.x + 51*51*u.y + 51*v.x + v.y;
  50. int tp = mp[q];
  51. if(4e8 == tp)
  52. {
  53. continue;
  54. }
  55. if(0 == tp)
  56. {
  57. v.time = u.time + 1;
  58. v.key = u.key;
  59. if(mk[v.x][v.y] && 0==(mk[v.x][v.y]&u.key))
  60. {
  61. v.key += mk[v.x][v.y];
  62. }
  63. if(vis[v.key][v.x][v.y])
  64. {
  65. continue;
  66. }
  67. vis[v.key][v.x][v.y] = 1;
  68. que.push(v);
  69. }
  70. else
  71. {
  72. if(u.key & (1<<tp))
  73. {
  74. v.time = u.time + 1;
  75. v.key = u.key;
  76. if(mk[v.x][v.y] && 0==(mk[v.x][v.y]&u.key))
  77. {
  78. v.key += mk[v.x][v.y];
  79. }
  80. if(vis[v.key][v.x][v.y])
  81. {
  82. continue;
  83. }
  84. vis[v.key][v.x][v.y] = 1;
  85. que.push(v);
  86. }
  87. }
  88. // printf("%d %d %d %d\n", v.x, v.y, v.time, v.key);
  89. }
  90. }
  91. return -1;
  92. }
  93.  
  94. int main()
  95. {
  96. while(~scanf("%d%d%d", &n, &m, &p))
  97. {
  98. scanf("%d", &k);
  99. mp.clear();
  100. memset(mk, 0, sizeof(mk));
  101. while(k--)
  102. {
  103. int ux, uy, vx, vy, g, hx, hy;
  104. scanf("%d%d%d%d%d", &ux, &uy, &vx, &vy, &g);
  105. hx = 51*51*51*ux + 51*51*uy + 51*vx + vy;
  106. hy = 51*51*51*vx + 51*51*vy + 51*ux + uy;
  107. if(0 == g) g = 4e8;
  108. mp[hx] = mp[hy] = g;
  109. }
  110. scanf("%d", &s);
  111. while(s--)
  112. {
  113. int x, y, q;
  114. scanf("%d%d%d", &x, &y, &q);
  115. mk[x][y] += (1<<q);
  116. }
  117. printf("%d\n", BFS());
  118. }
  119. return 0;
  120. }

HDOJ 5095

分析:水题,写的时候注意处理-1,0。1就差点儿相同了。还有首位为正。不须要+。

传送门:点击打开链接

代码:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <map>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. typedef long long lint;
  11. const int MAXN = 20;
  12. char ch[] = {'p', 'q', 'r', 'u', 'v', 'w', 'x', 'y', 'z'};
  13. int ia[MAXN], t;
  14.  
  15. int main()
  16. {
  17. scanf("%d", &t);
  18. while(t--)
  19. {
  20. for(int i=0; i<10; ++i)
  21. {
  22. scanf("%d", ia+i);
  23. }
  24. int first = 1, zero = 1;
  25. for(int i=0; i<10; ++i)
  26. {
  27. if(0 == ia[i])
  28. {
  29. continue;
  30. }
  31. zero = 0;
  32. if(ia[i] < 0)
  33. {
  34. if(-1 == ia[i])
  35. {
  36. if(i < 9)
  37. {
  38. printf("-");
  39. }
  40. else
  41. {
  42. printf("-1");
  43. }
  44. }
  45. else
  46. {
  47. printf("%d", ia[i]);
  48. }
  49. first = 0;
  50. }
  51. else
  52. {
  53. if(1 == ia[i])
  54. {
  55. if(!first)
  56. {
  57. printf("+");
  58. }
  59. first = 0;
  60. if(i == 9)
  61. {
  62. printf("1");
  63. }
  64. }
  65. else
  66. {
  67. if(!first)
  68. {
  69. printf("+");
  70. }
  71. first = 0;
  72. printf("%d", ia[i]);
  73. }
  74. }
  75. if(i < 9)
  76. {
  77. printf("%c", ch[i]);
  78. }
  79. }
  80. if(zero) printf("0");
  81. printf("\n");
  82. }
  83. return 0;
  84. }

HDOJ 5098

队友写的,贴个代码。之后补。

传送门:点击打开链接

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<string>
  5. #include<map>
  6. #include<algorithm>
  7. using namespace std;
  8. char info[1010][1030];
  9. int need[1010][1010],nn[1010];
  10. int num[1010];
  11. int res[1010],ns; //ns为软件数量,res表示是否要重新启动
  12. map<string,int> list;
  13. int dfs(int now)
  14. {
  15. if(num[now]!=-1)
  16. return num[now];
  17. int ma=0,i;
  18. for(i=0;need[now][i]!=-1;i++)
  19. {
  20. int t=need[now][i];
  21. if(res[t])
  22. ma=max(ma,dfs(t)+1);
  23. else
  24. ma=max(ma,dfs(t));
  25. }
  26. num[now]=ma;
  27. return num[now];
  28. }
  29. int main()
  30. {
  31. //freopen("D:\\in.txt","r",stdin);
  32. int t,i,j,count=1;
  33. cin>>t;
  34. getchar();
  35. getchar();
  36. while(t--)
  37. {
  38. memset(info,0,sizeof(info));
  39. list.clear();
  40. memset(res,0,sizeof(res));
  41. i=0;
  42. while(gets(info[i])) //開始数据处理
  43. {
  44. if(strlen(info[i])==0)
  45. break;
  46. j=0;
  47. while(info[i][j]!='*'&&info[i][j]!=':')
  48. j++;
  49. list[string(info[i],j)]=i;
  50. if(info[i][j]=='*')
  51. res[i]=1;
  52. i++;
  53. }
  54. ns=i;
  55. memset(need,-1,sizeof(need));
  56. memset(nn,0,sizeof(nn));
  57. for(i=0;i<ns;i++)
  58. {
  59. int s=0;
  60. while(info[i][s]!=' '&&s!=strlen(info[i]))
  61. s++;
  62. int e=s;
  63. while(e!=strlen(info[i]))
  64. {
  65. s=e;
  66. e++;
  67. while(e!=strlen(info[i])&&info[i][e]!=' ')
  68. e++;
  69. need[i][nn[i]++]=list[string(info[i]+s+1,e-s-1)];
  70. }
  71. } //数据处理结束。need[i]表示i的依赖包,到-1结束
  72. memset(num,-1,sizeof(num));
  73. int ma=0;
  74. for(i=0;i<ns;i++)
  75. {
  76. if(res[i])
  77. ma=max(ma,dfs(i)+1);
  78. else
  79. ma=max(ma,dfs(i));
  80. }
  81. printf("Case %d: %d\n",count++,ma);
  82. }
  83. }

HDOJ 5099

分析:水题,字符串比較。

传送门:

pid=5099">点击打开链接

代码:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <queue>
  4. #include <map>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int MAXN = 2e3+10;
  11. char cha[MAXN], chb[MAXN];
  12. int t, icase = 1;
  13.  
  14. int main()
  15. {
  16. scanf("%d", &t);
  17. while(t--)
  18. {
  19. scanf("%s%s", cha, chb);
  20. // puts(cha); puts(chb);
  21. printf("Case %d: ", icase++);
  22. if(cha[0] > chb[0])
  23. {
  24. printf("> ");
  25. }
  26. else if(cha[0] < chb[0])
  27. {
  28. printf("< ");
  29. }
  30. else
  31. {
  32. printf("= ");
  33. }
  34. if(cha[1] != chb[1])
  35. {
  36. cha[5] = chb[5] = '\0';
  37. }
  38. int ret = strcmp(cha+2, chb+2);
  39. if(ret > 0)
  40. {
  41. printf(">");
  42. }
  43. else if(ret < 0)
  44. {
  45. printf("<");
  46. }
  47. else
  48. {
  49. printf("=");
  50. }
  51. printf("\n");
  52. }
  53. return 0;
  54. }

2014上海全国邀请赛题解 HDOJ 5090-5099的更多相关文章

  1. 2014湘潭全国邀请赛I题 Intervals /POJ 3680 / 在限制次数下取有权区间使权最大/小问题(费用流)

    先说POJ3680:给n个有权(权<10w)开区间(n<200),(区间最多数到10w)保证数轴上所有数最多被覆盖k次的情况下要求总权最大,输出最大权. 思路:       限制的处理:s ...

  2. HDOJ 5090 Game with Pearls 二分图匹配

    简单的二分图匹配: 每个位置可以边到这些数字甚至可以边 Game with Pearls Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: ...

  3. UVA LA 7146 2014上海亚洲赛(贪心)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=648&problem=5158&mosm ...

  4. 贪心 HDOJ 5090 Game with Pearls

    题目传送门 /* 题意:给n, k,然后允许给某一个数加上k的正整数倍,当然可以不加, 问你是否可以把这n个数变成1,2,3,...,n, 可以就输出Jerry, 否则输出Tom. 贪心:保存可能变成 ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. HDU5092——Seam Carving(动态规划+回溯)(2014上海邀请赛重现)

    Seam Carving DescriptionFish likes to take photo with his friends. Several days ago, he found that s ...

  7. HDU5093——Battle ships(最大二分匹配)(2014上海邀请赛重现)

    Battle ships Problem DescriptionDear contestant, now you are an excellent navy commander, who is res ...

  8. HDU5099——Comparison of Android versions(简单题)(2014上海邀请赛重现)

    Comparison of Android versionsProblem DescriptionAs an Android developer, itˇs really not easy to fi ...

  9. HDU5090——Game with Pearls(匈牙利算法|贪心)(2014上海邀请赛重现)

    Game with Pearls Problem DescriptionTom and Jerry are playing a game with tubes and pearls. The rule ...

随机推荐

  1. MySQL JDBC的setFetchSize

    MySQL JDBC的setFetchSize http://uuhorse.iteye.com/blog/2163582 http://blog.sina.com.cn/s/blog_6706203 ...

  2. POJ 3349 Snowflake Snow Snowflakes(哈希)

    http://poj.org/problem?id=3349 题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的. 思路:一开始以为把每一个雪花的六个角的长度sort一下,然后 ...

  3. CDC 虚拟com口

    现在很多电脑已经不带232了,特别是手提电脑.这使很多使用手提在外调试人员非常不方便.或许你可以买一条市面上usb转232转换线,但这些线抗干扰不是太好,在一些干扰大的地方会发生连接中断的问题,所以往 ...

  4. 二维图形的矩阵变换(二)——WPF中的矩阵变换基础

    原文:二维图形的矩阵变换(二)--WPF中的矩阵变换基础 在前文二维图形的矩阵变换(一)——基本概念中已经介绍过二维图像矩阵变换的一些基础知识,本文中主要介绍一下如何在WPF中进行矩阵变换. Matr ...

  5. RPGJS 进阶分析之 如何使用RMXP导出的数据

    首先启动RMXP 在主脚本编辑区粘贴官方提供的导出数据脚本. 之后启动并进入游戏之后按F8键就可以调出导出Map和Animation的菜单 导出后的数据保存在工程目录下的RpgJs目录下. Datab ...

  6. [转] AC自动机详解

    转载自:http://hi.baidu.com/nialv7/item/ce1ce015d44a6ba7feded52d AC自动机详解 AC自动机是用来处理多串匹配问题的,即给你很多串,再给你一篇文 ...

  7. import project后,出现Unable to get system library for the project

    import project 后,出现Unable to get system library for the project. 这是因为在import 一个项目的时候,没有指定android sdk ...

  8. 安装qc 出现error An error occurred while attempting to connect to the database.

    When trying to install mercury quality center starter edition 9.0 on Windows XP media center, I am g ...

  9. TextField笔记

    今天写scrollPanel组件,碰到一个问题:textfield自动什么时候会调节高度. 在创建TextField的时候,我制定了文本的height属性. 之后,无论怎么设置文本,height总是不 ...

  10. insertion Sort List (链表的插入排序) leecode java

    逻辑简单,代码难写,基础不劳,leecode写注释不能出现中文,太麻烦,我写了大量注释,链表问题最重要的就是你那个指针式干啥的 提交地址https://oj.leetcode.com/problems ...