多校联合(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 }
原文地址:https://www.cnblogs.com/fxh19911107/p/2631615.html