• Codeforces Round #259 (Div. 2) 解题报告


    终于重上DIV1了。。。。

    A:在正方形中输出一个菱形

    解题代码:

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

    B:问一个循环序列是否可以变成不递减的序列,如果可以,输出循环最小步数

    解题代码:

     1 // File Name: b.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年08月01日 星期五 23时41分55秒
     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 #define LL long long
    26 using namespace std;
    27 int a[200005];
    28 int main(){
    29   int n ;
    30   scanf("%d",&n);
    31   int ok = 0 ;
    32   a[0] = 0 ;
    33   int be = 0 ; 
    34   for(int i =1 ;i <= n;i ++)
    35   {
    36      scanf("%d",&a[i]);
    37      if(a[i] < a[i-1] && !ok)
    38      {
    39        ok = 1;
    40        be = i ; 
    41      }
    42   }
    43   if(ok == 0 )
    44   {
    45      printf("0
    ");
    46      return 0;
    47   }
    48   for(int i = 1 ;i <= n;i ++)
    49       a[i+n] = a[i];
    50   ok =0 ;
    51   for(int i = be +1;i<= be +n -1;i ++)
    52   {
    53     if(a[i] < a[i-1])
    54     {
    55         ok = 1 ;
    56         break;
    57     }
    58   }
    59   if(ok  == 0 )
    60       printf("%d
    ",n-be + 1);
    61   else printf("-1
    ");
    62   return 0;
    63 }
    View Code

    C:问你 有m面的筛子,投n次,最大的那个数的期望值是多少 

    解题思路:可知如果都为 1  ,那么 几率为(1/m)^n

    既有1又有2且仅有 1,2   那么 几率为 (2/m)^n  ,那么 答案为一的几率 就是  (2/m)^n - (1/m)^n
    以此递推,答案为  x 的几率为 (x/m)^n - ((x-1)/m)^n,
    所以累加即为答案
    解题代码:
     1 // File Name: c.cpp
     2 // Author: darkdream
     3 // Created Time: 2014年08月02日 星期六 00时14分13秒
     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 #define LL long long
    26 using namespace std;
    27 double P(double  x,int  n)
    28 {
    29   if(n == 1)
    30       return x; 
    31   double t = P(x,n/2);
    32   if(n % 2 == 0)
    33   {
    34       return t*t; 
    35   }else{
    36     return t*t*x;
    37   }
    38 }
    39 double a[100005];
    40 int main(){
    41    int n , m; 
    42    scanf("%d %d",&m,&n);
    43    double ans ;
    44    a[1] = ans = P(1.0/m,n);
    45    for(int i = 2;i <= m;i ++)
    46    {
    47        a[i] = P(i*1.0/m,n);
    48        ans += i *(a[i] - a[i-1]);
    49    }
    50    printf("%lf
    ",ans);
    51 return 0;
    52 }
    View Code

      D:给你长度为n的数组,让你构造一个数组使得b数组两两互质且   |Bi - Ai| 累加和最小

    解题思路: DP + 2进制运算,DP[i][j]表示第i个 状态为j 的最小累加和,每一种状态都用 1-60的情况去枚举 然后2进制快速判断是否满足条件,就可以DP出答案了

    解题代码:

      1 // File Name: 454d.cpp
      2 // Author: darkdream
      3 // Created Time: 2014年08月02日 星期六 18时29分50秒
      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 #define LL long long
     26 using namespace std;
     27 int n ; 
     28 int hs[40];
     29 int b[40];
     30 int lb = 0 ; 
     31 int p2[30];
     32 int fuck[66];
     33 void init()
     34 {
     35     memset(hs,0,sizeof(hs));
     36     for(int i = 2 ;i <= 60 ;i ++)
     37     {
     38         int ok = 1 ; 
     39         for(int j =2;j < i ;j ++)
     40             if(i % j == 0 )
     41                 ok = 0 ; 
     42         if(ok == 1)
     43         {
     44             lb ++ ;
     45             b[lb] = i ; 
     46         }
     47     }
     48     p2[1] = 1;
     49     for(int i= 2;i <= 20;i ++)
     50         p2[i] = p2[i-1] * 2;
     51     memset(fuck,0,sizeof(fuck));
     52     for(int i =2;i <= 60 ;i ++)
     53     {
     54         for(int j = 1;j <= lb ;j ++)
     55             if(i % b[j] == 0 )
     56                 fuck[i] += p2[j];
     57     }
     58 }
     59 const int mx = 1 << 17;
     60 int  dp[101][mx+10];
     61 struct node{
     62     int from;
     63     int num;
     64 }exdp[101][mx+10];
     65 int rans[40] = {0};
     66 int a[104];
     67 void dfs(int n,int k)
     68 {
     69     if(k == 0 )
     70         return;
     71     dfs(exdp[k][n].from,k-1);
     72     printf("%d ",exdp[k][n].num);
     73 }
     74 int main(){
     75     init();
     76     //printf("%d",sizeof(dp)/4);
     77     scanf("%d",&n);
     78     for(int i =1 ;i <= n;i ++)
     79     {
     80         int temp ; 
     81         scanf("%d",&a[i]);
     82         hs[a[i]] ++;         
     83     }
     84     memset(dp,0xff,sizeof(dp));
     85     dp[0][0] = 0 ;
     86     for(int i =1;i <= n;i ++)
     87     {
     88         for(int j = 0 ;j <= mx;j ++)
     89         {
     90             if(dp[i-1][j] != -1)
     91             {
     92                 for(int s = 2;s <= 60;s ++)
     93                 {
     94                     if((j & fuck[s]) == 0 )  
     95                     {
     96                         int t = j^fuck[s]; 
     97                         int ans = dp[i-1][j] + abs(s-a[i]);
     98                         if(ans < dp[i][t] || dp[i][t] == -1 )
     99                         {
    100                             dp[i][t] =  ans ; 
    101                             exdp[i][t].from = j;
    102                             exdp[i][t].num = s;
    103                         }
    104                     }
    105                 }
    106                 int ans = dp[i-1][j] + abs(1-a[i]);
    107                 if(ans  < dp[i][j] || dp[i][j] == -1) 
    108                 {
    109                     dp[i][j] =  ans ; 
    110                     exdp[i][j].from = j;
    111                     exdp[i][j].num = 1;
    112                 }
    113             }
    114         }
    115     }
    116     int anssum = 1e9 ; 
    117     int ansnum = 0 ;
    118     for(int i = 0 ;i <= mx ;i ++)
    119     {
    120         if(dp[n][i] != -1 && anssum > dp[n][i])
    121         {   
    122             anssum = dp[n][i];
    123             ansnum = i ; 
    124         }
    125     }
    126     dfs(ansnum,n);
    127     return 0;
    128 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    vue-cli构建项目 npm run build后应该怎么运行在本地查看效果
    解析JSON数组
    Lambda
    keytool不是内部或外部命令
    XML布局
    HTML5本地存储IndexedDB基础使用
    Vue 2.0基础
    cs231n__3. LostFunction
    cs231n__2. K-nearest Neighbors
    week_Last
  • 原文地址:https://www.cnblogs.com/zyue/p/3887609.html
Copyright © 2020-2023  润新知