zoukankan      html  css  js  c++  java
  • 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
    没有梦想,何谈远方
  • 相关阅读:
    TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常?
    当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
    @Qualifier 注解?
    Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?它们有何区别?
    Filter是什么?有什么作用?
    List和 Map区别?
    Spring框架的事务管理有哪些优点?
    Listener是什么?有什么作用?
    字节流与字符流的区别?
    Struts2里面有什么隐式对象?
  • 原文地址:https://www.cnblogs.com/zyue/p/3853020.html
Copyright © 2011-2022 走看看