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
    没有梦想,何谈远方
  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/zyue/p/3853020.html
Copyright © 2011-2022 走看看