多校联合(6)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4350
以为移动的都是 0 到 r - 1 内的牌,所以直接模拟就行了
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,估计数据再强点又超了
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 时要特判
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]数组的求法,还以为是按解题报告给的思路写的,下午童鞋跟我说思路是不一样的
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 }