A 挑战密室

化学方程式求分子量

这题我懒得写了

可以用map<string,int>哈希表,表示每种分子的相对分子质量

之后,从头遍历到尾。

1.数字:连读直到不是数字

2.字母:连读直到不是字母

3.括号:从左括号开始遍历,重复1、2,到右括号退出

下面这个代码可以AC,但是有bug的,数字超过10,或者字母连着>3个就挂了

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<map>
  4. #include<string>
  5. using namespace std;
  6. map<string,int> x;
  7. int main()
  8. {
  9. x["N"]=14;x["C"]=12;x["O"]=16;x["Cl"]=35;x["S"]=32;x["H"]=2;x["Al"]=27;x["Ca"]=40;x["Zn"]=65;x["Na"]=23;
  10. int t;scanf("%d",&t);
  11. char ch[52],xx[3];
  12. while (t--)
  13. {
  14. int i;
  15. scanf("%s",ch);int ll=strlen(ch);
  16. for (i=0;i<ll;i++)
  17. if (ch[i]=='=')
  18. break;
  19. int lplp=1;
  20. i++;int s,ss=0,ks;
  21. if ('0'<ch[i]&&ch[i]<='9')
  22. {
  23. lplp=ch[i]-'0';
  24. i++;
  25. }
  26. for (;i<ll;i++)
  27. {
  28. if (ch[i]=='+')
  29. break;
  30. if (ch[i]=='(')
  31. {
  32. s=0;i++;
  33. for (;;i++)
  34. {
  35. if (ch[i]==')') break;
  36. if ('A'<=ch[i]&&ch[i]<='Z')
  37. {
  38. xx[0]=ch[i];
  39. xx[1]=0;
  40. if ('a'<=ch[i+1]&&ch[i+1]<='z')
  41. {
  42. i++;
  43. xx[1]=ch[i];
  44. xx[2]=0;
  45. }
  46. }
  47. ks=x[xx];
  48. if ('0'<ch[i+1]&&ch[i+1]<='9')
  49. {
  50. i++;
  51. ks*=ch[i]-'0';
  52. }
  53. s+=ks;
  54. }
  55. if ('0'<ch[i+1]&&ch[i+1]<='9')
  56. {
  57. i++;
  58. s*=ch[i]-'0';
  59. }
  60. ss+=s;
  61. }
  62. else
  63. {
  64. if ('A'<=ch[i]&&ch[i]<='Z')
  65. {
  66. xx[0]=ch[i];
  67. xx[1]=0;
  68. if ('a'<=ch[i+1]&&ch[i+1]<='z')
  69. {
  70. i++;
  71. xx[1]=ch[i];
  72. xx[2]=0;
  73. }
  74. }
  75. ks=x[xx];
  76. if ('0'<ch[i+1]&&ch[i+1]<='9')
  77. {
  78. i++;
  79. ks*=ch[i]-'0';
  80. }
  81. ss+=ks;
  82. }
  83. }
  84. ss*=lplp;
  85. printf("%04d\n",ss);
  86. }
  87. return 0;
  88. }

B 最大岛屿

dfs统计连通分量模板

  1. void dfs(int x,int y){
  2. flood[x][y] = area;
  3. for(int i=0;i<8;i++){
  4. int tx = x + dr[i][0];
  5. int ty = y + dr[i][1];
  6. if(in(tx,ty) && a[tx][ty] == 1 && flood[tx][ty] == 0){
  7. dfs(tx,ty);
  8. }
  9. }
  10. }

主要注意地图的读写,中间有空格,可以用getchar读取

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 510;
  4. int m,n,t;
  5. int a[maxn][maxn];
  6. int area = 0;
  7. int flood[maxn][maxn];
  8. int dr[8][2] = {{0,1},{0,-1},{-1,0},{1,0},{1,-1},{-1,1},{-1,-1},{1,1}};
  9. int s[maxn*maxn];
  10. bool in(int x,int y){
  11. return x>=1 && x<=n && y>=1 && y<=m;
  12. }
  13. void dfs(int x,int y){
  14. flood[x][y] = area;
  15. for(int i=0;i<8;i++){
  16. int tx = x + dr[i][0];
  17. int ty = y + dr[i][1];
  18. if(in(tx,ty) && a[tx][ty] == 1 && flood[tx][ty] == 0){
  19. dfs(tx,ty);
  20. }
  21. }
  22. }
  23. int main(){
  24. cin>>n>>m>>t;
  25. getchar();
  26. char ch;
  27. for(int i=1;i<=n;i++){
  28. for(int j=1;j<=m;j++){
  29. while((ch = getchar()) == ' '){}
  30. a[i][j] = ch - '0';
  31. }
  32. getchar();
  33. }
  34. for(int i=1;i<=n;i++){
  35. for(int j=1;j<=m;j++){
  36. if(flood[i][j] == 0 && a[i][j] == 1){
  37. area++;
  38. dfs(i,j);
  39. }
  40. }
  41. }
  42. for(int i=1;i<=n;i++){
  43. for(int j=1;j<=m;j++){
  44. if(flood[i][j] != 0){
  45. s[flood[i][j]]++;
  46. }
  47. }
  48. }
  49. long long maxarea = 0;
  50. for(int i=1;i<=area;i++){
  51. if(s[i] > maxarea) maxarea = s[i];
  52. }
  53. cout<<area<<" "<<maxarea*t<<endl;
  54. return 0;
  55. }

C 最少换乘

写bfs搜索(求最短路)过的

首先把所有与起点1同一路线的点都入队(step表示换成次数 = 0)

bfs每次取出头部,搜索

当两点时同一公交路线时,新状态step不变

当两点不是同一公交路线时,新状态step+1

vis二维数组标记这条边是否走过

另外注意:这道题读入比较麻烦

没有告诉我们 每行有多少个数

我用getline函数来读的,getline(std::cin,string),读入到字符串string中

其他博客写的题解,用单源点最短路dijkstra做的 https://blog.csdn.net/dreamlandz/article/details/51509382

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 510;
  4. int g[maxn][maxn];
  5. int t;
  6. int n,m;
  7. int a[maxn];
  8. int vis[maxn][maxn];
  9. struct edge{
  10. int u;
  11. int w;
  12. edge(int uu = 0,int ww = 0){
  13. u = uu;
  14. w = ww;
  15. }
  16. };
  17. vector<edge> v[maxn];
  18. int sstation;
  19. int estation;
  20. struct node{
  21. int xx;
  22. int station;
  23. int step;
  24. node(int xxx,int stations,int steps){
  25. xx = xxx;
  26. station = stations;
  27. step = steps;
  28. }
  29. };
  30. int bfs(){
  31. queue<node> q;
  32. // q.push(node(1,3,0)); //这里应该把和a相连的全部入队 就是下面几行
  33. for(int i=0;i<v[1].size();i++){
  34. vis[1][v[1][i].u]= 1;
  35. q.push(node(v[1][i].u,v[1][i].w,0));
  36. }
  37. int ans = 0x3f3f3f3f;
  38. while(!q.empty()){
  39. int x = q.front().xx;
  40. int sta = q.front().station;
  41. int step = q.front().step;
  42. if(x==n){
  43. ans = min(ans,step);
  44. }
  45. q.pop();
  46. for(int i=0;i<v[x].size();i++){
  47. if(vis[x][v[x][i].u]) continue;
  48. if(v[x][i].w == sta){
  49. vis[x][v[x][i].u] = 1;
  50. q.push(node(v[x][i].u,sta,step));
  51. }else{
  52. vis[x][v[x][i].u] = 1;
  53. q.push(node(v[x][i].u,v[x][i].w,step+1));
  54. }
  55. }
  56. }
  57. return ans;
  58. }
  59. int main(){
  60. cin>>t;
  61. while(t--){
  62. memset(vis,0,sizeof(vis));
  63. cin>>m>>n;
  64. getchar();
  65. for(int i=1;i<=m;i++){
  66. string temp;
  67. getline(std::cin, temp);
  68. int len = 0;
  69. for(int j=0;j<temp.length();j++){
  70. int sum = 0;
  71. while(j < temp.length() && temp[j] != ' '){
  72. sum = sum*10 + (temp[j] - '0');
  73. j++;
  74. }
  75. a[len++] = sum;
  76. }
  77. for(int j=0;j<len;j++){
  78. for(int p = j+1;p<len;p++){
  79. v[a[j]].push_back(edge(a[p],i));
  80. }
  81. }
  82. }
  83. int ans = 0;
  84. ans = bfs();
  85. if(ans == 0x3f3f3f3f){
  86. cout<<"NO"<<endl;
  87. }else{
  88. cout<<ans<<endl;
  89. }
  90. for(int i=0;i<maxn-1;i++){
  91. v[i].clear();
  92. }
  93. }
  94. return 0;
  95. }

D 引水工程

最小生成树,prim和kru...都可以过

kru最小生成树

建图时 自己对自己也算一条边(如果要选条边,不能算n-1条边里)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. /*
  4. 想法1:
  5. kru最小生成树
  6. 建图时 自己对自己也算一条边(如果要选条边,不能算n-1条边里)
  7. */
  8. /*
  9. 想法2:从权值最小的开始建水库 prim算法
  10. */
  11. //kru做法
  12. int n,m,minn,father[305],sum,tem[305];
  13. struct node
  14. {
  15. int x,y,l;
  16. }a[90005];
  17. bool cmp(node a,node b)
  18. {
  19. return a.l<b.l;
  20. }
  21. int find(int x) // 做了时间上的优化 ,但是 在空间复杂度上比较高
  22. {
  23. if(x!=father[x])
  24. father[x]=find(father[x]);
  25. sum++;
  26. return father[x];
  27. }
  28. bool merge(int x,int y) // 做了时间复杂度上的优化 让并查集的 深度尽量 浅
  29. {
  30. int sum1,sum2;
  31. sum=0;
  32. x=find(x);
  33. sum1=sum; // x 的深度
  34. sum=0;
  35. y=find(y);
  36. sum2=sum; // y 的深度
  37. if(x!=y)
  38. {
  39. if(sum1>sum2)
  40. father[y]=x;
  41. else
  42. father[x]=y;
  43. return true;
  44. }
  45. else
  46. return false;
  47. }
  48. int main() // 先用 Dijkstra 做一次 // Dijkstra 是 根据边来做的
  49. {
  50. int t;
  51. scanf("%d",&t);
  52. while(t--)
  53. {
  54. scanf("%d",&n);
  55. for(int i=0;i<=n;i++)
  56. father[i]=i;
  57. int q=0;
  58. //i从0开始 多输了一次
  59. for(int i=0;i<=n;i++)
  60. {
  61. for(int j=1;j<=n;j++)
  62. {
  63. int e;
  64. scanf("%d",&e);
  65. a[q].x=j;
  66. a[q].y=i;
  67. a[q].l=e;
  68. q++;
  69. }
  70. }
  71. int sum3=0,count1=0;
  72. sort(a,a+q,cmp);
  73. for(int i=0;i<q;i++)
  74. {
  75. if(merge(a[i].x,a[i].y))
  76. {
  77. sum3+=a[i].l;
  78. count1++;
  79. }
  80. if(count1==n) // 如果边数等于 所有需要连接的 点数-1的话 就跳出去
  81. break;
  82. }
  83. printf("%d\n",sum3);
  84. }
  85. return 0;
  86. }

Prim求最小生成树

在选择最小邻接边时,和顶点再比较一下

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int inf = 0x3f3f3f3f;
  4. const int maxn = 510;
  5. bool vis[maxn];
  6. int dist[maxn];
  7. int g[maxn][maxn];
  8. int a[maxn];
  9. int n,t;
  10. //想法2:从权值最小的开始建水库 prim算法
  11. //有水可以自身引水 或者其它地区引水 所以如果 最小的邻接边的费用 比对应顶点的权值大 就自己引水
  12. int Prim(int pos){
  13. int ans = 0;
  14. memset(vis,false,sizeof(vis));
  15. ans = a[pos];
  16. vis[pos] = true;
  17. for(int i=1;i<=n;i++) dist[i] = g[pos][i];
  18. for(int i=1;i<=n-1;i++){
  19. int minc = inf;
  20. int p = -1;
  21. for(int j=1;j<=n;j++){
  22. if(!vis[j] && minc > dist[j]){
  23. minc = dist[j];
  24. p = j;
  25. }
  26. }
  27. //应题目中的要求(每个点都要有水)
  28. //有水可以自身引水 或者其它地区引水 所以如果 最小的邻接边的费用 比对应顶点的权值大 就自己引水
  29. if(minc > a[p]){
  30. ans += a[p];
  31. vis[p] = true;
  32. continue;
  33. }
  34. vis[p] = true;
  35. ans += dist[p];
  36. for(int j=1;j<=n;j++){
  37. if(!vis[j] && dist[j] > g[p][j]){
  38. dist[j] = g[p][j];
  39. }
  40. }
  41. }
  42. return ans;
  43. }
  44. int main(){
  45. cin>>t;
  46. while(t--){
  47. cin>>n;
  48. int minv = inf;
  49. int pos = 1;
  50. for(int i=1;i<=n;i++){
  51. cin>>a[i];
  52. if(a[i] < minv){
  53. minv = a[i];
  54. pos = i;
  55. }
  56. }
  57. for(int i=1;i<=n;i++){
  58. for(int j=1;j<=n;j++){
  59. cin>>g[i][j];
  60. }
  61. }
  62. cout<<Prim(pos)<<endl;
  63. }
  64. return 0;
  65. }

F Distribution

校赛也出了这一道题,比较简单

给定两条线,求一三象限 与 二四象限 上的 点数差

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1100;
  4. int n,m;
  5. int g[maxn][maxn]; // 0开始(0也算)
  6. int maxx = 0;
  7. int maxy = 0;
  8. int solve(int x,int y){
  9. int sum = 0;
  10. for(int i=0;i<x;i++){
  11. for(int j=0;j<y;j++){
  12. if(g[i][j] == 1)
  13. sum++;
  14. }
  15. }
  16. for(int i=x+1;i<=maxx+1;i++){
  17. for(int j=y+1;j<=maxy+1;j++){
  18. if(g[i][j] == 1)
  19. sum++;
  20. }
  21. }
  22. return sum;
  23. }
  24. int main(){
  25. cin>>n>>m;
  26. for(int i=1;i<=n;i++){
  27. int xi,yi;
  28. cin>>xi>>yi;
  29. g[xi][yi] = 1;
  30. if(xi > maxx) maxx = xi;
  31. if(yi > maxy) maxy = yi;
  32. }
  33. for(int i=1;i<=m;i++){
  34. int x,y;
  35. cin>>x>>y;
  36. int ans1 = 0;
  37. int ans2 = 0;
  38. ans1 = solve(x,y);
  39. ans2 = n - ans1;
  40. cout<<ans1 - ans2<<endl;
  41. }
  42. return 0;
  43. }

G Interference Signal

题意:给定n个数,求最大的 至少连续m个数的平均值

枚举起点,算平均值就可以了

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 2050;
  4. int t;
  5. int a[maxn];
  6. int sum[maxn];
  7. int n,m;
  8. int main(){
  9. cin>>t;
  10. while(t--){
  11. cin>>n>>m;
  12. for(int i=1;i<=n;i++){
  13. cin>>a[i];
  14. a[i] = a[i] * 1000;
  15. }
  16. memset(sum,0,sizeof(sum));
  17. sum[0] = 0;
  18. for(int i=1;i<=n;i++){
  19. sum[i] = sum[i-1] + a[i];
  20. }
  21. double average = 0;
  22. for(int i=1;i<=n;i++){
  23. for(int j=i+m-1;j<=n;j++){
  24. double avetemp = (sum[j] - sum[i-1])*1.0/ (j-i+1);
  25. if(avetemp > average) average = avetemp;
  26. }
  27. }
  28. int ans = average;
  29. printf("%d\n",ans);
  30. }
  31. return 0;
  32. }

每天一套题打卡|河南省第八届ACM/ICPC的更多相关文章

  1. 每天一套题打卡|河南省第十届ACM/ICPC

    A.谍报分析 题意:请你编程,快速统计出频率高的前十个单词. 思路:字符串输入,map哈希表map<string,int >记录每个单词出现的次数,pair重载优先级 #include&l ...

  2. 每天一套题打卡|河南省第十一届ACM/ICPC

    A 计划日 题意:已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 模拟日期计算: 计算星期可以用基姆拉尔森公式 //中国 ...

  3. 每天一套题打卡|河南省第七届ACM/ICPC

    A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...

  4. 每天一套题打卡|河南省第九届ACM/ICPC

    A 表达式求值 表达式求值:可以用递归求解,也可以用栈模拟,考过多次. 类似题目:NYOJ305,NYOJ35 用栈模拟做法: #include <stdio.h> #include &l ...

  5. 河南省第八届ACM省赛---引水工程

    引水工程 时间限制:2000 ms  |  内存限制:65535 KB 难度: 描述 南水北调工程是优化水资源配置.促进区域协调发展的基础性工程,是新中国成立以来投资额最大.涉及面最广的战略性工程,事 ...

  6. nyoj 1239 引水project (河南省第八届acm程序设计大赛)

    题目1239 pid=1239" style="color:rgb(55,119,188)">题目信息 pid=1239" style="col ...

  7. nyoj1237 最大岛屿(河南省第八届acm程序设计大赛)

    题目1237 pid=1237" style="color:rgb(55,119,188)">题目信息 执行结果 本题排行 讨论区 最大岛屿 时间限制:1000 m ...

  8. nyoj 1238 最少换乘 (河南省第八届acm程序设计大赛)

    题目1238 题目信息 执行结果 本题排行 pid=1238" style="text-decoration:none; color:rgb(55,119,188)"&g ...

  9. 河南省第八届ACM程序设计大赛总结

    简单的对这次省赛做个总结:总体来说这个比赛过程中做的还算比较顺利,虽然中间多多少少遇到一些坑,正式比赛开始后,我们就开始找水题,当然了我首先把英文题目翻译了一遍,发现了一道水题,这道题目其实就是判断点 ...

随机推荐

  1. Physically Based Shader Development for Unity 2017 Develop Custom Lighting Systems (Claudia Doppioslash 著)

    http://www.doppioslash.com/ https://github.com/Apress/physically-based-shader-dev-for-unity-2017 Par ...

  2. 【搜索】N皇后问题

    原题传送门 思路 很经典的搜索题,但本蒟蒻卡了1个多小时,搜索部分很简单,但是判重的部分是真的蛋疼,我写了一个高效率的判重算法,但是无论检查多少遍都没有问题的算法却总是WA......后来我干脆写了一 ...

  3. redis命令之 ----String(字符串)

    SET SET key value [EX seconds] [PX milliseconds] [NX|XX] 将字符串值 value 关联到 key . 如果 key 已经持有其他值, SET 就 ...

  4. jwt入门

    JWT(JSON Web Token)是一个非常轻巧的规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,通常使用在HTTP通信过程中进行身份认证. 我们知道,HTTP通信是无状态的 ...

  5. 缘起 Dubbo ,讲讲 Spring XML Schema 扩展机制

    背景 在 Dubbo 中,可以使用 XML 配置相关信息,也可以用来引入服务或者导出服务.配置完成,启动工程,Spring 会读取配置文件,生成注入 相关 Bean.那 Dubbo 如何实现自定义 X ...

  6. LeetCode 1290. Convert Binary Number in a Linked List to Integer

    题目 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListN ...

  7. 【Easyexcel】java导入导出超大数据量的xlsx文件 解决方法

    解决方法: 使用easyexcel解决超大数据量的导入导出xlsx文件 easyexcel最大支持行数 1048576. 官网地址: https://alibaba-easyexcel.github. ...

  8. 论文笔记 Stacked Hourglass Networks for Human Pose Estimation

     Stacked Hourglass Networks for Human Pose Estimation key words:人体姿态估计 Human Pose Estimation 给定单张RGB ...

  9. Triangulation by Ear Clipping(耳切法处理多边形三角划分)(转载)

    转载自: https://www.cnblogs.com/xignzou/p/3721494.html 使用EarClipping三角化多边形(翻译) ---Triangulation by Ear ...

  10. 记netmvc中Html.BeginForm的一个大坑

    在asp.net mvc中,很常使用using(Html.BeginForm()){}来生成表单提交 不传入参数时,默认提交到原始url 最坑的是,此表单自动提交时,会将所在页面的原始url的参数也一 ...