题目链接:http://uoj.ac/problem/123


又开提答坑啦,要不是一定要讲题谁他妈要这样伤害自己

CASE 1,2

  首先可以打一个通用暴力,用于模拟操作过程,对于每一个操作随机一个选择,然后跑多次记录答案。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. #include<string>
  9. #include<ctime>
  10. using namespace std;
  11. #define maxn 1000010
  12. #define llg long long
  13. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  14. llg n,m,dl[maxn],tail,anst,ans[maxn],val[maxn],maxl,cs;
  15. llg T=;
  16. char ch,s[maxn];
  17.  
  18. llg next_x(llg x){x++; while (s[x]==' ') x++; return x;}
  19.  
  20. struct node
  21. {
  22. llg type;
  23. llg t1,v1,t2,v2,fu,to1,to2;
  24. }a[maxn];
  25.  
  26. llg make_number(llg &x)
  27. {
  28. llg val=,p=;
  29. if (s[x]=='-') x++,p=-;
  30. while (s[x]>='' && s[x]<='')
  31. {
  32. val*=;
  33. val+=s[x]-'';
  34. x++;
  35. }
  36. return val*p;
  37. }
  38.  
  39. void Decompression_(llg i)
  40. {
  41.  
  42. llg x=;
  43. if (s[x]=='v')
  44. {
  45. a[i].type=;
  46. x=next_x(x);
  47. a[i].v1=make_number(x);
  48. x=next_x(x);
  49. if (s[x]=='+') a[i].fu=;else a[i].fu=-;
  50. x=next_x(x);
  51. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  52. x=next_x(x);
  53. a[i].v2=make_number(x);
  54. }
  55. if (s[x]=='s')
  56. {
  57. a[i].type=;
  58. x=next_x(x);
  59. a[i].to1=make_number(x);
  60. x=next_x(x);
  61. a[i].to2=make_number(x);
  62. }
  63. if (s[x]=='i')
  64. {
  65. a[i].type=;
  66. x=next_x(x);
  67. if (s[x]=='c') a[i].t1=; else a[i].t1=;
  68. x=next_x(x);
  69. a[i].v1=make_number(x);
  70. x=next_x(x);
  71. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  72. x=next_x(x);
  73. a[i].v2=make_number(x);
  74. x=next_x(x);
  75. a[i].to1=make_number(x);
  76. x=next_x(x);
  77. a[i].to2=make_number(x);
  78. }
  79. }
  80.  
  81. bool pd(char ch)
  82. {
  83. if (ch>='' && ch<='') return ;
  84. if (ch=='v' || ch=='i' || ch=='+' || ch=='-' || ch=='s' || ch=='c' || ch==' ') return ;
  85. return ;
  86. }
  87.  
  88. void init()
  89. {
  90. cin>>n>>m;
  91. ch=getchar();
  92. for (llg i=;i<=n;i++)
  93. {
  94. llg len=;
  95. ch=getchar();
  96. while (pd(ch)) {s[++len]=ch; ch=getchar();}
  97. Decompression_(i);
  98. for (llg i=;i<=len+;i++) s[i]='\0';
  99. }
  100. }
  101.  
  102. void work()
  103. {
  104. cs=;
  105. llg x=,cho;
  106. tail=;
  107. for (llg i=;i<=m;i++) val[i]=;
  108. while (x>= && x<=n)
  109. {
  110. if (a[x].type==)
  111. {
  112. if (a[x].t2) val[a[x].v1]+=val[a[x].v2]*a[x].fu;
  113. else val[a[x].v1]+=a[x].v2*a[x].fu;
  114. x++;
  115. }
  116. if (a[x].type==)
  117. {
  118. cs++;
  119. if (cs>) {return ;}
  120. cho=rand()%+;
  121. if (cho==) x=a[x].to1; else x=a[x].to2;
  122. dl[++tail]=cho;
  123. }
  124. if (a[x].type==)
  125. {
  126. llg val1,val2;
  127. if (a[x].t1) val1=val[a[x].v1];else val1=a[x].v1;
  128. if (a[x].t2) val2=val[a[x].v2];else val2=a[x].v2;
  129. if (val1<val2) x=a[x].to1; else x=a[x].to2;
  130. }
  131. }
  132. }
  133.  
  134. int main()
  135. {
  136. yyj("train7");
  137. init();
  138. srand(time(NULL));
  139. fclose(stdin);
  140. // freopen("make.in","r",stdin);
  141. maxl=(llg)1e16*-;
  142. T=;
  143. while (T--)
  144. {
  145. // system("make.exe");
  146. work();
  147. if (val[]>maxl && cs<=)
  148. {
  149. maxl=val[];
  150. anst=tail;
  151. for (llg i=;i<=anst;i++) ans[i]=dl[i];
  152. }
  153. }
  154. // cout<<maxl<<endl;
  155. for (llg i=;i<=anst;i++) cout<<ans[i]<<endl;
  156. return ;
  157. }

    这样可以过第一,二个点,然后一共有31分。。。。

Ans1:

  1.  

Ans2:

  1.  

CASE 3

   可以发现有很多块,但是每一个块会根据在这个块中的所有变量的变化来修改变量1的值,每一个块中又分为10+个小块,小块中是对于变量2-m的修改,小块首有选择语句,可以选择是否跳过这个小块。

   块与块之间又互不影响,因为块尾会把除了变量1的所有变量全部清空。

   所以说,我们可以爆搜每一个块中的小块的决策,然后统计答案即可。

   

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. #include<string>
  9. #include<ctime>
  10. using namespace std;
  11. #define maxn 1000010
  12. #define llg long long
  13. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  14. llg n,m,dl[maxn],tail,anst,ans[maxn],val[maxn],maxl,cs;
  15. llg T=;
  16. char ch,s[maxn];
  17.  
  18. llg next_x(llg x){x++; while (s[x]==' ') x++; return x;}
  19.  
  20. struct node
  21. {
  22. llg type;
  23. llg t1,v1,t2,v2,fu,to1,to2;
  24. }a[maxn];
  25.  
  26. llg make_number(llg &x)
  27. {
  28. llg val=,p=;
  29. if (s[x]=='-') x++,p=-;
  30. while (s[x]>='' && s[x]<='')
  31. {
  32. val*=;
  33. val+=s[x]-'';
  34. x++;
  35. }
  36. return val*p;
  37. }
  38.  
  39. void Decompression_(llg i)
  40. {
  41.  
  42. llg x=;
  43. if (s[x]=='v')
  44. {
  45. a[i].type=;
  46. x=next_x(x);
  47. a[i].v1=make_number(x);
  48. x=next_x(x);
  49. if (s[x]=='+') a[i].fu=;else a[i].fu=-;
  50. x=next_x(x);
  51. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  52. x=next_x(x);
  53. a[i].v2=make_number(x);
  54. }
  55. if (s[x]=='s')
  56. {
  57. a[i].type=;
  58. x=next_x(x);
  59. a[i].to1=make_number(x);
  60. x=next_x(x);
  61. a[i].to2=make_number(x);
  62. }
  63. if (s[x]=='i')
  64. {
  65. a[i].type=;
  66. x=next_x(x);
  67. if (s[x]=='c') a[i].t1=; else a[i].t1=;
  68. x=next_x(x);
  69. a[i].v1=make_number(x);
  70. x=next_x(x);
  71. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  72. x=next_x(x);
  73. a[i].v2=make_number(x);
  74. x=next_x(x);
  75. a[i].to1=make_number(x);
  76. x=next_x(x);
  77. a[i].to2=make_number(x);
  78. }
  79. }
  80.  
  81. bool pd(char ch)
  82. {
  83. if (ch>='' && ch<='') return ;
  84. if (ch=='v' || ch=='i' || ch=='+' || ch=='-' || ch=='s' || ch=='c' || ch==' ') return ;
  85. return ;
  86. }
  87.  
  88. void init()
  89. {
  90. cin>>n>>m;
  91. ch=getchar();
  92. for (llg i=;i<=n;i++)
  93. {
  94. llg len=;
  95. ch=getchar();
  96. while (pd(ch)) {s[++len]=ch; ch=getchar();}
  97. Decompression_(i);
  98. for (llg i=;i<=len+;i++) s[i]='\0';
  99. }
  100. }
  101.  
  102. void work(llg x,llg up)
  103. {
  104. cs=;
  105. llg cho;
  106. tail=;
  107. for (llg i=;i<=m;i++) val[i]=;
  108. while (x>= && x<=up)
  109. {
  110. if (a[x].type==)
  111. {
  112. if (a[x].t2) val[a[x].v1]+=val[a[x].v2]*a[x].fu;
  113. else val[a[x].v1]+=a[x].v2*a[x].fu;
  114. x++;
  115. continue;
  116. }
  117. if (a[x].type==)
  118. {
  119. cs++;
  120. if (cs>) {return ;}
  121. cho=rand()%+;
  122. if (cho==) x=a[x].to1; else x=a[x].to2;
  123. dl[++tail]=cho;
  124. continue;
  125. }
  126. if (a[x].type==)
  127. {
  128. llg val1,val2;
  129. if (a[x].t1) val1=val[a[x].v1];else val1=a[x].v1;
  130. if (a[x].t2) val2=val[a[x].v2];else val2=a[x].v2;
  131. if (val1<val2) x=a[x].to1; else x=a[x].to2;
  132. continue;
  133. }
  134. }
  135. }
  136.  
  137. int main()
  138. {
  139. yyj("train3");
  140. init();
  141. srand(time(NULL));
  142. fclose(stdin);
  143. for (llg i=;i<=n;i+=)
  144. {
  145. maxl=(llg)1e16*-;
  146. T=;
  147. anst=;
  148. while (T--)
  149. {
  150. work(i,i+);
  151. if (val[]>maxl && cs<=)
  152. {
  153. maxl=val[];
  154. anst=tail;
  155. for (llg i=;i<=anst;i++) ans[i]=dl[i];
  156. }
  157. }
  158. for (llg i=;i<=anst;i++) cout<<ans[i]<<endl;
  159. }
  160. return ;
  161. }

Ans3:

  1.  

CASE 4,5,6

   这些点的特点是只有两个变量,每一次跳转都和变量2有关,而且变量二的变化量并不大,每一个跳转操作并不会往回跳(没有后效性),考虑做一次dp即可。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<cstring>
  8. #include<string>
  9. #include<ctime>
  10. #include<queue>
  11. using namespace std;
  12. #define maxn 1000010
  13. #define llg long long
  14. #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  15. llg n,m,tail,anst,ans[maxn],val[maxn],maxl,cs;
  16. llg T=;
  17. char ch,s[maxn];
  18.  
  19. llg next_x(llg x){x++; while (s[x]==' ') x++; return x;}
  20.  
  21. struct node
  22. {
  23. llg type;
  24. llg t1,v1,t2,v2,fu,to1,to2;
  25. }a[maxn];
  26.  
  27. llg make_number(llg &x)
  28. {
  29. llg val=,p=;
  30. if (s[x]=='-') x++,p=-;
  31. while (s[x]>='' && s[x]<='')
  32. {
  33. val*=;
  34. val+=s[x]-'';
  35. x++;
  36. }
  37. return val*p;
  38. }
  39.  
  40. void Decompression_(llg i)
  41. {
  42.  
  43. llg x=;
  44. if (s[x]=='v')
  45. {
  46. a[i].type=;
  47. x=next_x(x);
  48. a[i].v1=make_number(x);
  49. x=next_x(x);
  50. if (s[x]=='+') a[i].fu=;else a[i].fu=-;
  51. x=next_x(x);
  52. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  53. x=next_x(x);
  54. a[i].v2=make_number(x);
  55. }
  56. if (s[x]=='s')
  57. {
  58. a[i].type=;
  59. x=next_x(x);
  60. a[i].to1=make_number(x);
  61. x=next_x(x);
  62. a[i].to2=make_number(x);
  63. }
  64. if (s[x]=='i')
  65. {
  66. a[i].type=;
  67. x=next_x(x);
  68. if (s[x]=='c') a[i].t1=; else a[i].t1=;
  69. x=next_x(x);
  70. a[i].v1=make_number(x);
  71. x=next_x(x);
  72. if (s[x]=='c') a[i].t2=; else a[i].t2=;
  73. x=next_x(x);
  74. a[i].v2=make_number(x);
  75. x=next_x(x);
  76. a[i].to1=make_number(x);
  77. x=next_x(x);
  78. a[i].to2=make_number(x);
  79. }
  80. }
  81.  
  82. bool pd(char ch)
  83. {
  84. if (ch>='' && ch<='') return ;
  85. if (ch=='v' || ch=='i' || ch=='+' || ch=='-' || ch=='s' || ch=='c' || ch==' ') return ;
  86. return ;
  87. }
  88.  
  89. void init()
  90. {
  91. cin>>n>>m;
  92. ch=getchar();
  93. for (llg i=;i<=n;i++)
  94. {
  95. llg len=;
  96. ch=getchar();
  97. while (pd(ch)) {s[++len]=ch; ch=getchar();}
  98. Decompression_(i);
  99. for (llg i=;i<=len+;i++) s[i]='\0';
  100. }
  101. }
  102.  
  103. struct data
  104. {
  105. llg val,k,from;
  106. }dl[maxn];
  107.  
  108. vector<data>f[maxn];
  109.  
  110. void in(llg x,data w)
  111. {
  112. llg E=f[x].size();
  113. for (llg i=;i<E;i++)
  114. {
  115. if (f[x][i].k==w.k)
  116. {
  117. if (w.val>f[x][i].val) f[x][i]=w;
  118. return ;
  119. }
  120. }
  121. f[x].push_back(w);
  122. }
  123.  
  124. void work(data w,llg x)
  125. {
  126. llg nx; data nw=w;
  127. nw.from=x;
  128. if (a[x].type==)
  129. {
  130. nx=x+;
  131. if (a[x].v1==)
  132. {
  133. if (a[x].t2)
  134. {
  135. if (a[x].v2==) nw.val+=nw.val;else nw.val+=nw.k;
  136. }
  137. else nw.val+=a[x].v2;
  138. }
  139. else
  140. {
  141. if (a[x].t2)
  142. {
  143. if(a[x].v2==) nw.k+=nw.val; else nw.k+=nw.k;
  144. }
  145. else nw.k+=a[x].v2;
  146. }
  147. in(nx,nw);
  148. return ;
  149. }
  150. if (a[x].type==)
  151. {
  152. nx=a[x].to1;
  153. if (nx>n || n<) nx=;
  154. in(nx,nw);
  155. nx=a[x].to2;
  156. if (nx>n || n<) nx=;
  157. in(nx,nw);
  158. return ;
  159. }
  160. if (a[x].type==)
  161. {
  162. llg v1,v2;
  163. if (a[x].t1) {if (a[x].v1==) v1=nw.val;else v1=nw.k;}else v1=a[x].v1;
  164. if (a[x].t2) {if (a[x].v2==) v2=nw.val;else v2=nw.k;}else v2=a[x].v2;
  165. if (v1<v2) nx=a[x].to1;else nx=a[x].to2;
  166. if (nx>n || n<) nx=;
  167. in(nx,nw);
  168. return ;
  169. }
  170.  
  171. }
  172.  
  173. void dg(data x)
  174. {
  175. }
  176.  
  177. int main()
  178. {
  179. yyj("train4");
  180. init();
  181. srand(time(NULL));
  182. fclose(stdin);
  183. data S; S.val=,S.k=,S.from=-;
  184. f[].push_back(S);
  185. for (llg i=;i<=n;i++)
  186. {
  187. data w;
  188. llg W=f[i].size();
  189. // printf("%lld--->%lld\n",i,W);
  190. for (llg k=;k<W;k++)
  191. {
  192. w=f[i][k];
  193. work(w,i);
  194. }
  195. }
  196. llg W=f[].size();
  197. for (llg i=;i<W;i++)
  198. {
  199. if (f[][i].val>maxl)
  200. {
  201. maxl=f[][i].val;
  202. S=f[][i];
  203. }
  204. }
  205. dg(f[][i]);
  206. return ;
  207. }

Ans4:

  1.  

Ans5:

  1.  

Ans6:

  1.  

【NOI2013】小Q的修炼的更多相关文章

  1. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  2. uoj123 【NOI2013】小Q的修炼

    搞了一下午+半晚上.其实不是很难. 提答题重要的是要发现数据的特殊性质,然后根据不同数据写出不同的算法获得其对应的分数. 首先前两个测试点我们发现可以直接暴搜通过,事实上对于每个数据都暴搜加上一定的次 ...

  3. HD4505小Q系列故事——电梯里的爱情

    Problem Description 细心的同事发现,小Q最近喜欢乘电梯上上下下,究其原因,也许只有小Q自己知道:在电梯里经常可以遇到他心中的女神HR. 电梯其实是个很暧昧的地方,只有在电梯里,小Q ...

  4. hdu4505小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  5. 小Q系列故事——电梯里的爱情

    小Q系列故事——电梯里的爱情 Time Limit : 300/100ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total ...

  6. 平面直接坐标系线段相交问题(小Q(钟神)的问题)

    [问题描述] 小 Q 对计算几何有着浓厚的兴趣.他经常对着平面直角坐标系发呆,思考一些有趣的问题.今天,他想到了一个十分有意思的题目:首先,小 Q 会在?轴正半轴和?轴正半轴分别挑选?个点.随后,他将 ...

  7. hdu---(4515)小Q系列故事——世界上最遥远的距离(模拟题)

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  8. HDU-4515 小Q系列故事——世界上最遥远的距离

    小Q系列故事——世界上最遥远的距离 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  9. 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!

    我以为我会是最坚强的那一个 我还是高估了自己 我以为你会是最无情的那一个 还是我贬低了自己 就算不能够在一起 我还是为你担心 就算你可能听不清 也代表我的心意 那北极星的眼泪 闪过你曾经的眼角迷离 那 ...

随机推荐

  1. 启动rabbitmq,提示ERROR: node with name "rabbit" already running on "localhost"

    ➜ ~ rabbitmq-server ERROR: node with name "rabbit" already running on "localhost" ...

  2. context、config

    Tomcat启动时已经创建了context,并使用它读取了web.xml中的参数,后台可以从context里获取参数 后台获取参数代码: ServletContext context = getSer ...

  3. 软件包管理:yum在线管理-yum命令

    只要我们的电脑可以接入互联网,那么yum源就是配好的,yum命令可以直接使用. 列出的是服务器上全部的rpm包. 包名,包全名的概念只在rpm手动管理时有用. 关键字主要指包名,只要知道了关键字就可以 ...

  4. java的时间处理

    采用joda.time库 gradle,可以简化calendar的 compile "joda-time:joda-time:2.7" 例子:http://blog.csdn.ne ...

  5. AOAPC I: Beginning Algorithm Contests -- Training Guide (Rujia Liu) Chapter 3. Data Structures Fundamental Data Structures

    10410 这题说的是给了一棵多叉树的 bfs遍历轨迹 和dfs 遍历 轨迹 在父节点向叶子节点扩展的时候优先遍历编号较小的节点.我还原出这课树特殊判定 根据bfs的顺序来建立这课树,用一个队列安排要 ...

  6. Python 面试题集锦【315+道题】

    第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? P ...

  7. bzoj1658: [Usaco2006 Mar]Water Slides 滑水

    Description It's a hot summer day, and Farmer John is letting Betsy go to the water park where she i ...

  8. JCTools, 场景特化的并发工具

    同上一篇一样,在jmap -histo中发现MpscChunkedArrayQueue类的实例比较多,javadoc看了下,其原来是出自JC Tools,https://github.com/JCTo ...

  9. 01: 企业微信API开发前准备

    目录:企业微信API其他篇 01: 企业微信API开发前准备 02:消息推送 03: 通讯录管理 04:应用管理 目录: 1.1 术语介绍 1.2 开发步骤 1.1 术语介绍返回顶部 参考文档:htt ...

  10. 06: Django Admin

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...