Codeforces 448(#256 (Div. 2) ) 解题报告

第一次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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/3853020.html