题目1 CodeForces 605 A
题目大意:给定一个长度为n的序列,每次可以把一个数放到开头或者最后,求升序排好的最小次数。
求出原序列位置的最长上升子序列,用n减去最大的。我们只要保证相对大小不变就可以了。
Code:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdlib> 5 #include <cstring> 6 7 using namespace std; 8 9 const int N = 100000 + 5; 10 11 int n, a[N], dp[N], pos[N]; 12 13 int main() { 14 scanf("%d", &n); 15 for(int i = 1; i <= n; ++ i) scanf("%d", &a[i]); 16 for(int i = 1; i <= n; ++ i) pos[a[i]] = i; 17 dp[1] = 1; 18 for(int i = 2; i <= n; ++ i) 19 if(pos[i] > pos[i - 1]) dp[i] = dp[i - 1] + 1; 20 else dp[i] = 1; 21 printf("%d ", n - *max_element(dp + 1, dp + n + 1)); 22 return 0; 23 }
题目2 51nod 求阶乘长度
题目大意:如题。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 #include <cstring> 6 #include <iomanip> 7 #include <queue> 8 #include <stack> 9 #include <ctime> 10 #define ll long long 11 12 using namespace std; 13 14 const double pi=acos(-1.0); 15 const double e=exp(1); 16 17 int main(){ 18 ll n; 19 scanf("%lld",&n); 20 if (n==1) {printf("1 "); return 0;} 21 ll ans=0.5*log10(2.0*pi*n) + n*log10(n*1.0/e)+1; 22 printf("%lld ",ans); 23 return 0; 24 }