第一次AK了一套题。。有点小激动
A:

1 // File Name: a.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月17日 星期四 21时44分03秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 int a[10]; 27 int b[10]; 28 int main(){ 29 int suma = 0 ; 30 int sumb = 0 ; 31 for (int i = 1;i <= 3;i ++) 32 { 33 scanf("%d",&a[i]); 34 suma += a[i]; 35 } 36 for(int i =1 ;i<= 3;i ++) 37 { 38 scanf("%d",&b[i]); 39 sumb += b[i] ; 40 } 41 int n; 42 scanf("%d",&n); 43 int ta; 44 int tb; 45 if(suma % 5 == 0) 46 { 47 ta = suma/5; 48 }else { 49 ta = suma/5 + 1 ; 50 } 51 if(sumb % 10 == 0) 52 { 53 tb = sumb/10; 54 }else { 55 tb = sumb/10 + 1 ; 56 } 57 if(ta + tb <= n) 58 printf("YES "); 59 else printf("NO "); 60 return 0; 61 }
B:三种情况,其中一种需要最长上升子序列

1 // File Name: b.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月17日 星期四 22时12分12秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 char str[110]; 27 char str1[110]; 28 int dp[102][102]; 29 int hs[30]; 30 int hs1[30]; 31 int len; 32 int len1; 33 int ok1 = 0 ; 34 int is() 35 { 36 memset(dp,0,sizeof(dp)); 37 for(int i = 1;i <= len;i++) 38 { 39 for(int j = 1;j <= len1 ;j ++) 40 { 41 if(str[i-1] == str1[j-1]) 42 dp[i][j] = dp[i-1][j-1] + 1; 43 else dp[i][j] = max(dp[i-1][j],dp[i][j-1]); 44 } 45 } 46 /* for(int i = 1;i <= len;i++) 47 { 48 for(int j = 1;j <= len1 ;j ++) 49 { 50 printf("%d ",dp[i][j]); 51 } 52 printf(" "); 53 }*/ 54 //printf("%d ",dp[len][len1]); 55 if(dp[len][len1] == len1) 56 return 1; 57 return 0 ; 58 } 59 int main(){ 60 scanf("%s",str); 61 scanf("%s",str1); 62 len = strlen(str); 63 len1 = strlen(str1); 64 if(len < len1) 65 { 66 printf("need tree "); 67 return 0; 68 } 69 memset(hs,0,sizeof(hs)); 70 memset(hs1,0,sizeof(hs1)); 71 for(int i = 0 ;i < len;i ++) 72 { 73 hs[str[i] -'a'] ++; 74 } 75 for(int i = 0 ;i < len1;i ++) 76 { 77 hs1[str1[i] -'a'] ++; 78 } 79 for(int i = 0 ;i <= 26;i ++) 80 { 81 if(hs[i] < hs1[i]) 82 { 83 printf("need tree "); 84 return 0; 85 } 86 } 87 if(is()) 88 { 89 printf("automaton "); 90 }else { 91 // printf("%d %d ",len,len1); 92 if(len == len1) 93 printf("array "); 94 else printf("both "); 95 } 96 return 0; 97 }
C:递归区间划分求局部最优
这题可以知道,局部最优可以得到总体最优,用一个区间的最小值来把区间划分为不同的段。

1 // File Name: c.cpp 2 // Author: darkdream 3 // Created Time: 2013年11月30日 星期六 19时35分41秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 long long a[60000]; 27 long long solve(long long l , long long r , long long cen) 28 { 29 long long mi = a[l] ; 30 long long s = r-l + 1; 31 for(long long i = l; i <= r;i ++) 32 mi = min(mi,a[i]); 33 long long sum = mi - cen; 34 long long last = l ; 35 for(long long i = l ;i <= r; i ++) 36 { 37 if(a[i] == mi) 38 { 39 if(last < i) 40 sum += solve(last , i-1 ,mi); 41 last = i + 1; 42 } 43 } 44 printf("%I64d %I64d %I64d ",l,r,sum); 45 return min(s,sum); 46 } 47 int main() 48 { 49 int n; 50 scanf("%d",&n); 51 for(int i =1 ;i <= n;i ++) 52 scanf("%I64d",&a[i]); 53 printf("%I64d ",solve(1,n,0)); 54 return 0 ; 55 }
D:
很巧妙的一个二分思想的题目
这里我们需要找到 大于等于K 且数最小的那个数(这样才满足 i*j 的条件,我这里也是想了好久),这里也要用到二分的一些技巧

1 // File Name: d1.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月18日 星期五 10时38分20秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 25 using namespace std; 26 long long n , m , k ; 27 long long solve(long long t) 28 { 29 long long sum = 0 ; 30 for(int i = 1;i <= n;i ++) 31 { 32 sum += min(m,t/i); 33 } 34 return sum ; 35 } 36 int main(){ 37 38 scanf("%lld %lld %lld",&n,&m,&k); 39 long long l = 1,r = n*m,mid,ans; 40 while(l <= r ) 41 { 42 // printf("%lld %lld ",l,r); 43 long long mid = (l+r) >> 1; 44 if(solve(mid) >= k ) 45 { 46 r = mid - 1; 47 }else 48 l = mid + 1; 49 } 50 printf("%I64d ",l); 51 return 0; 52 }
E:
这个题目也利用到了 BFS树的 一些性质,它的第K 层就是 我们要求的k层答案,但是我们在BFS的时候可以用了两个优化。一个是输出的数大于100000的时候返回
另一个是在如果这个数为 1 就继续往下找了。

1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2014年07月18日 星期五 21时36分19秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 using namespace std; 26 LL sum = 0 ; 27 LL t = 0 ; 28 LL a[100000]; 29 LL x, k; 30 void dfs(LL x,LL c) 31 { 32 if(sum >= 100000) 33 return ; 34 if( x == 1 || c == 0 ){ 35 printf("%I64d ",x); 36 sum ++ ; 37 return ; 38 } 39 for(LL i = 1;i <= t && x >= a[i];i ++ ) 40 { 41 if(x % a[i] == 0) 42 { 43 dfs(a[i],c-1); 44 } 45 } 46 return ; 47 } 48 int main(){ 49 scanf("%I64d %I64d",&x,&k);; 50 for(LL i =1;i <= sqrt(x); i ++){ 51 if(x % i == 0 ){ 52 a[++t] = i ; 53 if(i != x/i) 54 a[++t] = x/i; 55 } 56 } 57 sort(a+1,a+1+t); 58 dfs(x,k); 59 return 0; 60 }