• 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
    没有梦想,何谈远方
  • 相关阅读:
    2013.4.15 Particle Swarm Optimization with Skyline Operator for Fast Cloudbased Web Service Composition
    Adaptive service composition in flexible processes
    2013.4.13 DomainSpecific Service Selection for Composite Services
    2013.4.14 Modeling and Algorithms for QoSAware Service Composition in VirtualizationBased Cloud Computing
    2013.5.29 Towards Networkaware Service Composition in the Cloud
    Efficient algorithms for Web services selection with endtoend QoS constraints
    SQL Server中常用的SQL语句
    接口限流自定义注解
    linux服务器生产环境搭建
    MVEL自定义函数重复掉用报错:duplicate function
  • 原文地址:https://www.cnblogs.com/zyue/p/3853020.html
Copyright © 2020-2023  润新知