标签:没有 white tin net 之间 题目 situation sample ever
Description
Figure 1. To the left: The two blocks‘ ports and their signal mapping (4,2,6,3,1,5). To the right: At most three signals may be routed on the silicon surface without crossing each other. The dashed signals must be bridged.
A typical situation is schematically depicted in figure 1. The ports of the two functional blocks are numbered from 1 to p, from top to bottom. The signal mapping is described by a permutation of the numbers 1 to p in the form of a list of p unique numbers
in the range 1 to p, in which the i:th number pecifies which port on the right side should be connected to the i:th port on the left side.
Two signals cross if and only if the straight lines connecting the two ports of each pair do.
Input
Output
Sample Input
4 64 2 6 3 1 5 102 3 4 5 6 7 8 9 10 1 88 7 6 5 4 3 2 1 95 8 9 2 3 1 7 4 6
Sample Output
3 9 1 4
我们有两种思路求能够參考shuoj上的D序列的题目。这里给出题目的题解链接::shuojD序列
主要是两种思路::(1)lower_bound(2)二分法,假设认为代码不易理解能够点上面的链接
将数组A中子序列长度为 i 的最小值存放在数组S中。我们以3 2 4 6 5 7 3 为例进行演示行为遍历,列为数组S。变化的地方已经标出来,有助于理解。
在这里a[ i ] > s[ j ]&&a[i]<=s[ j + 1 ]就应该把a[ i ]放在s[ j+1 ]的位置。
所以关键就是找出 j 就知道把a[ i ]放在哪了。
上面的两种方法就是用来寻找 j的 。
(在这里lower_bound直接返回 j + 1 )
0 | 1 | 2 | 3 | 4 |
1 | 3 | |||
2 | 2 | |||
3 | 2 | 4 | ||
4 | 2 | 4 | 6 | |
5 | 2 | 4 | 5 | |
6 | 2 | 4 | 5 | 7 |
7 | 2 | 3 | 5 | 7 |
这里给出另外一种方法代码::
#include <iostream> #include<cstring> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; const int N = 1e5 + 5; int s[N]; int n,p,a[N]; int len; int main() { cin>>n; while(n--){ cin>>p; memset(s,0,sizeof(s)); for(int i = 0;i<p;i++)cin>>a[i]; s[1] = a[0];len = 1;//长度从1開始 for(int i = 1;i<p;i++){ int t = a[i]; if(t>s[len])s[++len] = a[i]; else{ /*************/int l = 1,r = len,mid;//这里的二分法採用了左闭右闭的思路 <span style="white-space:pre"> </span>int ans = 0; while(l<=r) { mid = (l+r)/2; if(s[mid]<t) {l = mid +1;ans = max(ans,mid);}//ans即为思路中的j,j必定为s数组中小于t的最大的数 else r = mid-1; } s[ans+1] = t;/******************/ } } //for(int i = 1;i<p;i++){cout<<s[i];}//有必要能够打开看看s中存的是什么值 cout<<len<<endl; } return 0; }假设代码不易理解请点击链接,链接为::shuoj—D序列
第一种的代码仅仅要将两个/**************/之间的代码换为
int p = lower_bound(s+1,s+len+1,t)-s; s[p] = t;就能够了。
HDU1950-Bridging signals-最长上升子序列
标签:没有 white tin net 之间 题目 situation sample ever
原文地址:http://www.cnblogs.com/jzssuanfa/p/6747080.html