记录编号 557376 评测结果 AAAAAAA
题目名称 [POJ 3460]书籍排列 最终得分 100
用户昵称 GravatarOasiz 是否通过 通过
代码语言 C++ 运行时间 0.027 s
提交时间 2020-11-13 19:52:49 内存使用 3.90 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cstdio>
  5. using namespace std;
  6. const int N = 100;
  7. int q[N];
  8. int stp[5][N];
  9. int n;
  10. int f(){
  11. int ans=0;
  12. for(int i = 0; i < n - 1; i++) {
  13. if(q[i + 1] != q[i] + 1)
  14. ans++;
  15. }
  16. return (ans+2)/3;//最少修改tot/3次
  17. }
  18. bool check() {
  19. for(int i = 0; i < n; i++) {
  20. if(q[i] != i + 1)
  21. return false;
  22. }
  23. return true;
  24. }
  25. bool dfs(int depth, int maxx) {//限制1~4
  26. if(depth + f() > maxx) return false;
  27. if(check()) return true;
  28. for(int l = 0; l < n; l++){
  29. for(int r = l; r < n; r++) {
  30. for(int k = r + 1; k < n; k++) {
  31. memcpy(stp[depth], q, sizeof(q));
  32. int y, x;
  33. for(x = r + 1, y = l; x <= k; x++, y++){
  34. q[y] = stp[depth][x];
  35. }
  36. for(x = l; x <= r; x++, y++ ){
  37. q[y] = stp[depth][x];
  38. }
  39. if(dfs(depth + 1, maxx)) return true;
  40. memcpy(q, stp[depth], sizeof(q));
  41. }
  42. }
  43. }
  44. return false;
  45. }
  46. int main() {
  47. freopen("booksort.in","r",stdin);
  48. freopen("booksort.out","w",stdout);
  49. int t;
  50. cin >> t;
  51. while(t--){
  52. cin >> n;
  53. for(int i = 0; i < n; i++){
  54. cin >> q[i];
  55. }
  56. int depth = 0;
  57. while(depth<5&&!dfs(0,depth))depth++;
  58. if(depth>=5)cout<<"5 or more"<<endl;
  59. else cout<<depth<<endl;
  60. }
  61. return 0;
  62. }