这道题的意思紫书上是错误的……

难怪一开始我非常奇怪为什么第二个样例输出的是2, 按照紫书上的意思应该是22

然后就不管了,先写, 然后就WA了。

然后看了https://blog.csdn.net/wcr1996/article/details/43774331

发现是题意是错误的。

是从1到n的排列变成给的排列, 而不是反过来
其他人的博客都是逆向思维来写, 也就是我原来写误打误撞的那样, 只不过操作反过来, 以及最后

输出是反的。这种方法很值得学习

其实正向也不难, 无非是设置了一种新的优先级

把原来1至n的排列看作乱序的, 把给的排列看作有序的, 只需要给每个值分配一个id就好了。
然后我惊奇地发现, 直接正向来写最后输出的答案和给的输出样例是一模一样的。

可能出题者就是正向来写的。

我的解题思路就是一开始“忽略”交换需要在头举行, 先搜一遍然后搜到不是升序的时候, 就直接交换这两个元素

在交换的时候放到头在交换。实际上就是把序列中不是升序的交换过来, 然后一直这么做, 直到全部为升序为止。
然而需要在头进行只是一个“副产品”。具体看代码。


#include<cstdio>
#include<vector>
#include<algorithm>
#include<queue>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std; const int MAXN = 312;
int id[MAXN], n;
deque<int> q;
vector<int> ans; void Swap(int cur)
{
REP(i, 0, cur)
{
q.push_back(q.front());
q.pop_front();
ans.push_back(2);
}
ans.push_back(1);
swap(q[0], q[1]);
} bool check()
{
REP(i, 0, n)
{
if(id[q[i]] > id[q[(i+1)%n]] && !(id[q[i]] == n && id[q[(i+1)%n]] == 1))
{
Swap(i);
return true;
}
}
return false;
} int main()
{
while(~scanf("%d", &n) && n)
{
ans.clear();
while(!q.empty()) q.pop_back(); int start, x;
REP(i, 1, n + 1)
{
scanf("%d", &x);
id[x] = i;
q.push_back(i);
} while(check());
if(id[q[0]] != 1)
{
for(start = 0; id[q[start]] != 1; start++);
REP(i, 0, start) ans.push_back(2);
}
REP(i, 0, ans.size()) printf("%d", ans[i]);
puts("");
} return 0;
}


紫书 习题8-7 UVa 11925(构造法, 不需逆向)的更多相关文章

  1. 紫书 习题 8-24 UVa 10366 (构造法)

    又是一道非常复杂的构造法-- #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a) ...

  2. 紫书 习题 11-8 UVa 1663 (最大流求二分图最大基数匹配)

    很奇怪, 看到网上用的都是匈牙利算法求最大基数匹配 紫书上压根没讲这个算法, 而是用最大流求的. 难道是因为第一个人用匈牙利算法然后其他所有的博客都是看这个博客的吗? 很有可能-- 回归正题. 题目中 ...

  3. 紫书 习题 11-9 UVa 12549 (二分图最小点覆盖)

    用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #includ ...

  4. 紫书 习题 8-21 UVa 1621 (问题分析方法)

    知道是构造法但是想了挺久没有什么思路. 然后去找博客竟然只有一篇!!https://blog.csdn.net/no_name233/article/details/51909300 然后博客里面又说 ...

  5. 紫书 习题8-12 UVa 1153(贪心)

    本来以为这道题是考不相交区间, 结果还专门复习了一遍前面写的, 然后发现这道题的区间是不是 固定的, 是在一个范围内"滑动的", 只要右端点不超过截止时间就ok. 然后我就先考虑有 ...

  6. 紫书 习题 11-17 UVa 1670 (图论构造)

    一开始要符合题目条件, 那么肯定没有任何一个点是孤立的, 也就是说没有点的度数是1 所以我就想让度数是1的叶子节点相互连起来.然后WA 然后看这哥们的博客 https://blog.csdn.net/ ...

  7. 紫书 习题 8-22 UVa 1622 (构造法)

    这道题的构造法真的复杂--要推一堆公式--这道题写了几天了--还是没写出来-- 一开始简单的觉得先左右来回, 然后上下来回, 然后把剩下的执行完了好了, 然后就WA. 然后换了个思路, 觉得是贪心, ...

  8. 紫书 习题 11-15 UVa 1668 (图论构造法)

    参考了http://www.bubuko.com/infodetail-1276416.html 首先是逆向思维, 向把每条边看作一条路径, 然后再去合并 然后我们讨论怎么样合并时最优的 我们讨论当前 ...

  9. 紫书 习题8-6 UVa 1611 (构造法)

    这道题和例题8-1相当的像. 例题8-1https://blog.csdn.net/qq_34416123/article/details/80112017 一开始我还以为用归并的思想, 用交换把局部 ...

随机推荐

  1. Extjs win

    //创建window var win = Ext.create("Ext.window.Window", { id: "myWin", title: " ...

  2. 原生JS封装ajax以及request

    一.封装原生的xhr为ajax类 xhr以及用法见之前的文章 1.根据url确定请求的头部以及别的信息. var _headerConfig = {}; if(url.indexOf('getcapt ...

  3. 如何成为资深的python专家

    相信很多人有这种感受,python很简单,几天就学会了:做了一段时间就觉得python没什么好玩的,就这样. 一种语言有火这么久,必有它存在的道理. 第一.我们要相信她,她就像你的新女朋友一样,她会给 ...

  4. Socket实现一个简单的半双工通信

    Socket是client进行在网络与server进行数据交互的一种基本通信方式.通信有三种通信.即单工.半双工,和全双工. 所谓单工,就是仅仅可以进行单向通信,如bb机. 而半双工就是一来一回的通信 ...

  5. 关于Javakeywordsynchronized——单例模式的思考

    精彩的设计模式盛宴刚刚落下帷幕.三天的时间.真是学习到了非常多.当中,遗留的非常多的问题.今天就谈谈synchronized这个keyword.关于对synchronizedkeyword的思考是从单 ...

  6. js解析网络中的json数据

    <?php echo <<<_END <html> <head> </head> <body> <div id=" ...

  7. bzoj1202: [HNOI2005]狡猾的商人(差分约束)

    1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可 ...

  8. How to resolve unassigned shards in Elasticsearch——写得非常好

    How to resolve unassigned shards in Elasticsearch 转自:https://www.datadoghq.com/blog/elasticsearch-un ...

  9. Linux基础02

    ** Linux基本操作常用命令(二) ** 用户名与主机名 当你进入Linux终端时,你会看到如下样式的图片:     其中[z@z01]方括号内的z表示当前系统登录操作的用户名,@后的z01表示当 ...

  10. 关于lncRNA数据收集

    最近需要自己收集数据库里的核酸序列,于是直接面对一些神文 http://www.360doc.com/content/17/0120/08/30227855_623625901.shtml http: ...