Rating又跌了,第二个题,没想好就乱开始乱写了。。
我写乱搞贪心,没过。。。如果总人数很多judge函数写的不好,DIV2数据很水,直接暴力就行。
1 #include <cstring> 2 #include <cstdio> 3 #include <string> 4 #include <iostream> 5 #include <algorithm> 6 #include <vector> 7 using namespace std; 8 vector<int>::iterator it; 9 int p[101],dp[101],o[101],n,m; 10 struct node 11 { 12 int s,num; 13 }d[101]; 14 int cmp(node a,node b) 15 { 16 return a.s < b.s; 17 } 18 int judge(int x) 19 { 20 int i,j; 21 for(i = 0;i < n;i ++) 22 dp[i] = x; 23 for(i = 0;i < m;i ++) 24 { 25 o[i] = d[i].num; 26 } 27 j = n-1; 28 for(i = m-1;i >= 0;i --) 29 { 30 while(o[i]) 31 { 32 if(j < 0) return 0; 33 else if(p[j] >= d[i].s&&dp[j] > 0) 34 { 35 dp[j] --; 36 if(dp[j] == 0) 37 j --; 38 } 39 else if(p[j] < d[i].s) 40 return 0; 41 o[i] --; 42 } 43 } 44 return 1; 45 } 46 class SpaceWarDiv2 47 { 48 public: 49 int minimalFatigue(vector <int> magicalGirlStrength, vector <int> enemyStrength, vector <int> enemyCount) 50 { 51 int i; 52 n = 0; 53 memset(dp,0,sizeof(dp)); 54 for(it = magicalGirlStrength.begin(); it != magicalGirlStrength.end(); it ++) 55 { 56 p[n++] = *it; 57 } 58 m = 0; 59 for(it = enemyStrength.begin(); it != enemyStrength.end(); it ++) 60 { 61 d[m++].s = *it; 62 } 63 m = 0; 64 for(it = enemyCount.begin(); it != enemyCount.end(); it ++) 65 { 66 d[m++].num = *it; 67 } 68 sort(p,p+n); 69 sort(d,d+m,cmp); 70 if(p[n-1] < d[m-1].s) return -1; 71 for(i = 1;;i ++) 72 { 73 if(judge(i)) 74 return i; 75 } 76 } 77 };
第三题爆搜,看了一下,有人说,直接暴力+确定一个上界就可以了,然后我写了写,加了很多剪枝(有几个剪枝都是应该是正确的,其实我也不知道正确性),终于过了。。。
1 #include <cstring> 2 #include <cstdio> 3 #include <string> 4 #include <iostream> 5 #include <algorithm> 6 #include <vector> 7 using namespace std; 8 vector<int>::iterator it; 9 int flag[10],p[10]; 10 int minz,n; 11 void dfs(int x,int step,int num) 12 { 13 int i,s; 14 if(step > minz) 15 return ; 16 if(num > 2*n)//移动次数不能很多 17 return ; 18 s = 0; 19 for(i = 0;i < n;i ++) 20 { 21 if(!flag[i]) 22 { 23 s = 1; 24 break; 25 } 26 } 27 if(s == 0) 28 { 29 minz = min(minz,step); 30 return ; 31 } 32 if(x == 0) 33 { 34 if(!flag[x+1])//擦右边 35 { 36 flag[x+1] = step+1+p[x+1]; 37 dfs(x,step+1,num); 38 flag[x+1] = 0; 39 } 40 if(step >= flag[x+1])//往右边移动 41 { 42 dfs(x+1,step+1,num+1); 43 } 44 if(flag[x+1]&&step < flag[x+1]) 45 { 46 dfs(x,flag[x+1],num);//停留 47 } 48 } 49 else if(x == n-1) 50 { 51 if(!flag[x-1])//擦左边 52 { 53 flag[x-1] = step+1+p[x-1]; 54 dfs(x,step+1,num); 55 flag[x-1] = 0; 56 } 57 if(step >= flag[x-1]) 58 { 59 dfs(x-1,step+1,num+1); 60 } 61 if(flag[x-1]&&step < flag[x-1]) 62 { 63 dfs(x,flag[x-1],num);//停留 64 } 65 } 66 else 67 { 68 if(!flag[x+1])//擦右边 69 { 70 flag[x+1] = step+1+p[x+1]; 71 dfs(x,step+1,num); 72 flag[x+1] = 0; 73 } 74 if(!flag[x-1])//擦左边 75 { 76 flag[x-1] = step+1+p[x-1]; 77 dfs(x,step+1,num); 78 flag[x-1] = 0; 79 } 80 if(step >= flag[x+1])//往右边移动 81 { 82 dfs(x+1,step+1,num+1); 83 } 84 if(step >= flag[x-1]) 85 { 86 dfs(x-1,step+1,num+1); 87 } 88 if(flag[x-1]&&step < flag[x-1]) 89 { 90 dfs(x,flag[x-1],num);//停留 91 } 92 if(flag[x+1]&&step < flag[x+1]) 93 { 94 dfs(x,flag[x+1],num);//停留 95 } 96 } 97 } 98 class ColorTheCells 99 { 100 public: 101 int minimalTime(vector <int> dryingTime) 102 { 103 int sum; 104 sum = 1000000000; 105 for(it = dryingTime.begin();it != dryingTime.end();it ++) 106 { 107 p[n++] = *it; 108 sum = min(sum,*it); 109 } 110 sum += n*2;//定住上界 111 minz = sum; 112 dfs(0,0,0); 113 return minz; 114 } 115 };