zoukankan      html  css  js  c++  java
  • 多校联合(6)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4350

    以为移动的都是 0 到 r - 1 内的牌,所以直接模拟就行了

    View Code
     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <math.h>
     5 #define N 60
     6 #define _clr(a,val) (memset(a,val,sizeof(a)))
     7 
     8 using namespace std;
     9 
    10 typedef long long ll;
    11 
    12 struct node
    13 {
    14     int ind;
    15     int data;
    16 }p[N],tp[N];
    17 int da[N];
    18 int main()
    19 {
    20     int i;
    21     int t;
    22     int n,l,r;
    23     int cs = 0;
    24     //freopen("data.txt","r",stdin);
    25     scanf("%d",&t);
    26     while(t--)
    27     {
    28         _clr(da,0);
    29         for(i = 0; i < 52; i++)
    30         {
    31             scanf("%d",&p[i].data);
    32             p[i].ind = i;
    33         }
    34         scanf("%d%d%d",&n,&l,&r);
    35         printf("Case #%d: ",++cs);
    36         for(i = 0; i < r; i++)
    37         {
    38             ll temp = (ll)((ll)n * (r - l + 1) % r);
    39             int kemp = (i % r + temp) % r;
    40             da[kemp] = p[i].data;
    41         }
    42         printf("%d",da[0]);
    43         for(i = 1; i < r; i++)
    44         printf(" %d",da[i]);
    45         for(i = r; i < 52; i++)
    46         printf(" %d",p[i].data);
    47         printf("\n");
    48     }
    49     return 0;
    50 }

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4355

    这道题不知道的时候想用枚举,知道了是三分模板时,就觉得自己真够可以的,很简单的一个三分,但是感觉时间好卡,精度开的是 1e-6,然后怎么都TLE后来看见有人开2e-4可以过掉,不过跑的很慢 ,1800+ms,估计数据再强点又超了

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <algorithm>
     5 #include <math.h>
     6 #define N 50010
     7 #define exp 2e-4
     8 #define _clr(a,val) (memset(a,val,sizeof(a)))
     9 
    10 using namespace std;
    11 
    12 struct node
    13 {
    14     double x;
    15     double w;
    16 }s[N];
    17 int n,m;
    18 double dist(double key)
    19 {
    20     double sum = 0;
    21     for(int i = 0; i < n; i++)
    22     {
    23         double d = fabs(s[i].x - key);
    24         sum += (d * d * d * s[i].w);
    25     }
    26     return sum;
    27 }
    28 int main()
    29 {
    30     int i,t;
    31     int cs = 0;
    32     //freopen("data.txt","r",stdin);
    33     scanf("%d",&t);
    34     while(t--)
    35     {
    36         scanf("%d",&n);
    37         for(i = 0; i < n; i++)
    38         scanf("%lf%lf",&s[i].x,&s[i].w);
    39         double r = s[n - 1].x;
    40         double l = s[0].x;
    41         double lmid,rmid;
    42         double sum1 = 0.0,sum2 = 0.0;
    43         while(r - l > exp)
    44         {
    45             lmid = (l * 2.0 + r) / 3.0;
    46             rmid = (l + 2.0 * r) / 3.0;
    47 
    48             if(dist(lmid) < dist(rmid))
    49             {
    50                 r = rmid;
    51             }
    52             else
    53             {
    54                 l = lmid;
    55             }
    56         }
    57         printf("Case #%d: %d\n",++cs,(int)(dist(r) + 0.5));
    58     }
    59     return 0;
    60 }

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4357

    这个题很后悔,当时LM猜出了两个字符串差值是偶数时应该就可以,然后我们就开始写,可是我写特判 长度是2时竟然想简单了,没有模拟交换,而是直接判相等了(对自己很无语),导致我们错了一次后就换思路了

    因为每有一个字符变动时对与第一个字符串整体改变是 2 所以只要上下差值取余为零就可以转变,当然,长度是 2 时要特判

    View Code
     1 #include <stdio.h>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <math.h>
     5 #define N 100
     6 #define _clr(a,val) (memset(a,val,sizeof(a)))
     7 
     8 using namespace std;
     9 
    10 typedef long long ll;
    11 
    12 int main()
    13 {
    14     char str[N],sbr[N];
    15     int t;
    16     int cs = 0;
    17     //freopen("data.txt","r",stdin);
    18     cin>>t;
    19     while(t--)
    20     {
    21         cin>>str>>sbr;
    22         int len1 = strlen(str);
    23         printf("Case #%d: ",++cs);
    24         if(len1 == 2)
    25         {
    26             int flag = 0;
    27             for(int i = 0; i < 26; i++)
    28             {
    29                 if(!strcmp(str,sbr))
    30                 {
    31                     flag = 1;
    32                     break;
    33                 }
    34                 swap(str[0],str[1]);
    35                 if(str[0] == 'z') str[0] = 'a';
    36                 else
    37                 str[0]++;
    38                 //if(str[0] > 'z') str[0] = str[0] - 'z' + 'a' - 1;
    39                 //str[1]++;
    40                 if(str[1] == 'z') str[1] = 'a';
    41                 else
    42                 str[1]++;
    43                 //if(str[1] > 'z') str[1] = str[1] - 'z' + 'a' - 1;
    44             }
    45             if(flag) printf("YES\n");
    46             else printf("NO\n");
    47         }
    48         else
    49         {
    50             int sum = 0;
    51             for(int i = 0; i < len1; i++)
    52             sum += (sbr[i] - str[i]);
    53             if(sum % 2 == 0) printf("YES\n");
    54             else printf("NO\n");
    55         }
    56     }
    57     return 0;
    58 }

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4359

    恩,这个是看的解题报告   

    解题报告:根节点不受限制。所以N 个元素里面任选。还剩N − 1个。
    除根节点外最大的元素必然在根节点的右子树上。   然后假设深度D−1在右子树上,依次枚举左子树元素个数和深度≤ D−1的   所有情况(此处要用前缀和优化)DP 即可
    深度D − 1在左子树上同理可得。  (枚举时注意根节点和除根节点外最大数已被选,还有深度D − 1同时出现在两颗子树上的情况算了两次要剪掉一次

    左子树和<右子树和等价于左子树最大值<右子树最大值,这样下面枚举左子树时,如果左子树有 i 个节点,那么除去根节点和最大的那个右子树上就有 num - i - 1个节点

    参考代码链接 http://blog.csdn.net/cyberzhg/article/details/7848420

    上午看这个代码,没有详细看标程,只是看了一下c[i][j]数组的求法,还以为是按解题报告给的思路写的,下午童鞋跟我说思路是不一样的

    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <algorithm>
     5 #define N 370
     6 #define mod 1000000007
     7 #define _clr(a,val) (memset(a,val,sizeof(a)))
     8 
     9 using namespace std;
    10 
    11 typedef long long ll;
    12 int c[N][N];  // 计算i 个节点 选 j个的组合数
    13 ll tree[N][N]; // 节点为 i 深度为  1 到 j 时的总数 
    14 bool vis[N][N]; // 标记访问
    15 void init()
    16 {
    17     int i,j;
    18     for(i = 0; i < N; i++) c[i][0] = 1;
    19     for(i = 1; i < N; i++)
    20     {
    21         for(j = 1; j < N; j++)
    22         {
    23             if(i == j) c[i][j] = 1;
    24             else
    25             c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;  // 看的解题报告上写的,随时取余,以免超 long long
    26         }
    27     }
    28 }
    29 ll dfs(ll num,ll dep)
    30 {
    31     if(dep == 0) return 0;
    32     if(num == 1) return 1;
    33     if(vis[num][dep])
    34     {
    35         return tree[num][dep];
    36     }
    37     ll res = (num * ((dfs(num - 1,dep - 1) * 2) % mod)) % mod;  // 左 或 右为空时
    38     //cout<<"res = "<<res<<endl;
    39     for(ll i = 1; i < num - 1; i++)
    40     {
    41         res += (num * (c[num - 2][num - i - 1] * ((dfs(i,dep - 1) * dfs(num - i - 1,dep - 1)) % mod) % mod)) % mod; 
    42         res %= mod;
    43     }
    44     vis[num][dep] = true;
    45     return tree[num][dep] = res;
    46 }
    47 int main()
    48 {
    49     int t,cs = 0;
    50     init();
    51     //freopen("data.txt","r",stdin);
    52     int n,d;
    53     scanf("%d",&t);
    54     while(t--)
    55     {
    56         //_clr(vis,0);  // 如果加上会超的,但是不加用过vis一次后不会对以后有影响吗?
    57         scanf("%d%d",&n,&d);
    58         ll ans = (dfs(n,d) - dfs(n,d - 1) + mod) % mod; // 层数从 1 到 d 的数 - 层数从 1 到 (d - 1)的数为 深度 为 d 的数
    59         printf("Case #%d: %I64d\n",++cs,ans);
    60         //cout<<ans<<endl;
    61     }
    62     return 0;
    63 }
  • 相关阅读:
    [C语言
    [C语言
    [C语言
    [C语言
    [C语言
    [C语言
    [iOS]超详细Apache服务器的配置(10.10系统)
    IOS优秀博客
    「C」 数组、字符串、指针
    103.Binary Tree Zigzag Level Order Traversal(层序遍历)
  • 原文地址:https://www.cnblogs.com/fxh19911107/p/2631615.html
Copyright © 2011-2022 走看看