MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

USTH_Turning1 解题报告

Posted on 2011-11-02 19:24  MDeath-Kid  阅读(227)  评论(0)    收藏  举报

HDU 1432 - 1437

这次的比赛题目。

 

//codeblock 快捷键ctrl + j    ym STL帝,数据结构牛,DP神。

<br>

//什么是离线算法。

//代码风格

//递归的思想,把一个大的问题化为小的子结构,说说括号问题!

1002
 1 bool is_ok(char ss[]) {
2 int len = strlen(ss);
3
4 if(len == 1) {
5 //DB(ss[0]);
6 if(ss[0] >= 'p' && ss[0] <= 'z') {
7 return 1;
8 } else {
9 //else 忘记加了,WA了一次
10 return 0;
11 }
12 } else if(ss[0] == 'N'){
13 return is_ok(ss+1);
14 } else if(ss[0] == 'C' || ss[0] =='D' || ss[0] =='E' ||ss[0] =='I') {
15 char s1[MAXN],s2[MAXN];
16 bool temp = false;
17 for(int i = 2;i<=len-1;i++) {
18 int p = 0;
19 SET(s1,'\0');SET(s2,'\0');
20 while( ++p != i) s1[p-1] = ss[p];
21 //s1[p-1] = '\0';
22 //DB(s1<<"--");
23 p = i-1;
24 while( ++p != len) s2[p-i] = ss[p];
25 //s2[p] = '\0';
26 //DB(s2<<"--");
27
28 temp = is_ok(s1) && is_ok(s2);
29 //DB(temp);
30 if(temp) {
31 break;
32 }
33 }
34
35 return temp;
36
37 } else {
38 return false;
39 }
40 }
41
42 void init() {
43 //len = strlen(ss);
44
45 }
46
47 int main() {
48 char ss[MAXN];
49 while(~SCFS(ss)) {
50 init ();
51
52 if(is_ok(ss)) {
53 puts("YES");
54 } else {
55 puts("NO");
56 }
57 }
58 }

 //1002 LY

1002_LY
 1 //1002 0ms的剪枝
2 #include <iostream>
3 #include <stdio.h>
4 #include <algorithm>
5 #include <string>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <map>
9 #include <stack>
10 #include <math.h>
11 #include <queue>
12 using namespace std;
13 char s[260];
14 bool judge(char *str,int left,int right){
15 if(left==right){
16 if(str[left]>='p'&&str[left]<='z')
17 return 1;
18 return 0;
19 }
20 if(str[left]=='N'&&judge(str,left+1,right))
21 return 1;
22 else if(str[left]=='C'||str[left]=='D'||str[left]=='E'||str[left]=='I'){
23 for(int mid=left+1;mid+1<=right;mid++){
24 if(judge(str,left+1,mid)&&judge(str,mid+1,right))
25 return 1;
26 }
27 }
28 return 0;
29 }
30 int main(){
31 int i,j,k,len,flag,num;
32 while(gets(s)){
33 len=strlen(s);
34 if(judge(s,0,len-1))
35 printf("YES\n");
36 else
37 printf("NO\n");
38 }
39 return 0;
40 }



 

//模拟题,看到了集合的合并就用了set

1003
 1 int n,m;
2
3 struct node {
4 string s;
5 int rp;
6 node(string a,int r) {
7 s = a,rp =r;
8 }
9 };
10
11 set<node> st[MAXN];
12 set<node>::iterator p;
13
14 //排列方法
15 bool operator < (node a,node b) {
16 if(a.rp == b.rp) return a.s > b.s;
17 return a.rp < b.rp;
18 }
19 int main() {
20 while(~SCFD(n,m)) {
21 // 输入
22 F(i,n) {
23 int cas,rp;SCF(cas);
24 char ss[25];
25 while(cas--) {
26 scanf("%s %d",ss,&rp);
27 st[i].insert(node(ss,rp));
28 }
29 }
30 //测试排列是否正确,提交的时候忘记注释了。。
31 //for(p = st[0].begin();p!=st[0].end();p++) {
32 // cout<<p->s<<" "<<p->rp<<endl;
33 //}
34 F(i,m) {
35 int a,b;char ss[22];SCFS(ss);
36 //三中操作
37 if(ss[0] == 'J') {
38 SCFD(a,b);
39 //A ∩ B
40 set_union(st[a-1].begin(),st[a-1].end()
41 ,st[b-1].begin(),st[b-1].end()
42 ,inserter(st[a-1],st[a-1].begin()));
43 st[b-1].clear();
44
45 } else if(ss[4] == 'N'){
46 // insert
47 scanf("%d %s %d",&a,ss,&b);
48 st[a-1].insert(node(ss,b));
49 } else {
50 SCF(a);
51 // 取出了最应该被T的
52 printf("%s\n",(st[a-1].begin()->s).c_str());
53 st[a-1].erase(st[a-1].begin());
54 }
55 }
56 // 清零
57 F(i,n) {
58 st[i].clear();
59 }
60 }
61 }

 //1004

稳定婚姻匹配。

http://hi.baidu.com/huairenhuadong/blog/item/0578862a4e70533c5343c13e.html

报告:http://blog.csdn.net/me4546/article/details/6603811

 

//1005 LY

1005_LY
 1 这个是正确的 是上一种改进来的 一样的道理 只是处换成了乘法  
2 #include <iostream>
3 #include <stdio.h>
4 #include <algorithm>
5 #include <string>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <map>
9 #include <stack>
10 #include <math.h>
11 #include <queue>
12 using namespace std;
13 const int N=2001;
14 long long c[N][N],ans[10*N], data[N][10*N];
15 void init(){
16 c[1][0]=1;
17 c[1][1]=1;
18 for(int i=2;i<N;i++){
19 c[i][0]=1;
20 for(int j=1;j<i;j++)
21 c[i][j]=c[i-1][j-1]+c[i-1][j];
22 c[i][i]=1;
23 }
24 }
25 int main(){
26 int i,j,n,m,k;
27 init();
28 while(scanf("%d%d",&n,&m)!=EOF){
29 for(i=1;i<=n;i++){
30 scanf("%I64d",&data[i][0]);
31 for(j=1;j<=data[i][0];j++)
32 scanf("%I64d",&data[i][j]);
33 }
34 memset(ans,0,sizeof(ans));
35 for(i=1;i<=data[1][0];i++){
36 if(data[1][i]<=m)
37 ans[data[1][i]]=c[m][data[1][i]];}
38 for(i=2;i<=n;i++){
39 if(data[i][0]){
40 for(j=m;j>=0;j--){
41 if(ans[j]){
42 for(k=1;k<=data[i][0]&&data[i][k]+j<=m;k++){
43 if(data[i][k]>0)
44 ans[data[i][k]+j]+=ans[j]*c[m-j][data[i][k]];
45 }
46 }
47 }
48 }
49 }
50 printf("%I64d\n",ans[m]);
51 }
52 return 0;
53 }
1005_LY
 1 //这个是母函数原始做法 但由于精度问题交不了
2 #include <iostream>
3 #include <stdio.h>
4 #include <algorithm>
5 #include <string>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <map>
9 #include <stack>
10 #include <math.h>
11 #include <queue>
12 using namespace std;
13 const int N=1010;
14 int num[N][N];
15 int n,m;
16 double fac[10*N],temp[10*N],ans[10*N];
17 void init(){
18 fac[0]=1.0;
19 for(int i=1;i<N;i++)
20 fac[i]=fac[i-1]*i;
21 }
22 int main(){
23 int i,j,k;
24 init();
25 while(scanf("%d%d",&n,&m)!=EOF){
26 for(i=1;i<=n;i++){
27 scanf("%d",&num[i][0]);
28 for(j=1;j<=num[i][0];j++)
29 scanf("%d",&num[i][j]);
30 }
31 memset(ans,0.0,sizeof(ans));
32 memset(temp,0.0,sizeof(temp));
33 for(i=1;i<=num[1][0];i++){
34 ans[num[1][i]]=1.0/fac[num[1][i]];
35 }
36 for(i=2;i<=n;i++){
37 for(j=0;j<=n;j++){
38 for(k=1;k<=num[i][0]&&(j+num[i][k]<=n);k++)
39 temp[j+num[i][k]]+=ans[j]/fac[num[i][k]];
40 }
41 for(j=0;j<=n;j++){
42 ans[j]=temp[j];
43 temp[j]=0.0;
44 }
45 }
46 printf("%.0lf\n",ans[m]*fac[m]);
47 }
48 return 0;
49 }

 


 

//1006

//记忆化搜索,用此动机作为DP,然后递推。

1006
 1 int n,m,maxx;
2 double mat[3][3];
3 double dp[3][3][MAXN];
4
5 struct node {
6 int i,j,n;
7 node(int a,int b,int c) {
8 i=a,j=b,n=c;
9 }
10 };
11
12 vector <node> vec;
13
14 void DP() {
15 //递推
16 F(k,maxx) {
17 F(i,3) F(j,3) {
18 F(temp,3)
19 dp[i][temp][k+1] += (dp[i][j][k] * mat[j][temp]);
20 //DB(i<<" "<<j<<" "<<k<<" ");
21        //DB(dp[i][j][k]);
22 }
23 }
24
25 }
26
27 void init() {
28 vec.clear();
29 SET(mat,0);
30 SET(dp,0);
31 F(i,3) F(j,3) {
32 SCLF(mat[i][j]);
33 dp[i][j][0] = mat[i][j];
34 }
35 SCF(m);
36 int a,b,c;maxx = 0xffffffff;
37 while(m--) {
38 SCFT(a,b,c);
39 vec.push_back(node(a,b,c));
40 maxx = max(maxx,c);
41 }
42 }
43
44 int main ()
45 {
46 int cas;
47 SCF(cas);
48 while(cas --) {
49 init();
50 DP();
51
52 F(i,vec.size()) {
53 printf("%.3f\n",dp[vec[i].i-1][vec[i].j-1][vec[i].n-1]);
54 }
55 }
56 }

 //LY

1006JAVA_LY
 1 1006
2 import java.util.*;
3 import java.math.*;
4 public class Main{
5 static float ans[][]=new float[1005][4];
6 public static void init(int x){
7 for(int i=0;i<=x;i++)
8 for(int j=1;j<=3;j++)
9 ans[i][j]=0;
10 }
11 public static void main(String[] args) {
12 Scanner sc=new Scanner(System.in);
13 int t,i,j,m,x,y,n,k;
14 float turn[][]=new float[4][4];
15 t=sc.nextInt();
16 while((t--)>0){
17 for(i=1;i<=3;i++)
18 for(j=1;j<=3;j++)
19 turn[i][j]=sc.nextFloat();
20 m=sc.nextInt();
21 while((m--)>0){
22 x=sc.nextInt();
23 y=sc.nextInt();
24 n=sc.nextInt();
25 init(n);
26 for(i=1;i<=3;i++)
27 ans[1][i]=turn[x][i];
28 for(k=2;k<=n;k++)
29 for(i=1;i<=3;i++)
30 for(j=1;j<=3;j++)
31 ans[k][i]+=ans[k-1][j]*turn[j][i];
32 System.out.printf("%.3f",ans[n][y]);
33 System.out.println();
34 }
35 }
36 }
37 }