codeforces #293 div2 only

2015-02-25 15:32:50

小结:刷小号的场... (摸着黑在床上打... 脖子好酸QAQ)

  A题坑... 被hack后没怎么搞,就先写了C和D,最后把A过了。

  B题水,C题水,D题简单概率DP。

  ※... 然后靠C题long long hack两发...(小插曲:看到有人用perl写的C,不知道long long能不能hack,瞎hack一发失败了... QAQ)

  ※... 赛后补了E题,数学+贪心。

 

A:其实是个贪心... 随便写吧。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 
27 string a,b,c;
28 
29 int main(){
30     cin >> a >> b;
31     int i,j;
32     for(i = 0; i < a.size(); ++i){
33         if(b[i] > a[i]){
34             break;
35         }
36     }
37     if(i >= a.size()){
38         printf("No such string\n");
39         return 0;
40     }
41     for(j = a.size() - 1; j > i; --j){
42         if(a[j] < 'z'){
43             c = a;
44             c[j] = a[j] + 1;
45             break;
46         }
47         if(b[j] > 'a'){
48             c = b;
49             c[j] = b[j] - 1;
50             break;
51         }
52     }
53     if(j == i){
54         if(b[i] - a[i] <= 1){
55             printf("No such string\n");
56             return 0;
57         }
58         c = a;
59         c[i] = a[i] + 1;
60     }
61     cout << c << endl;
62     return 0;
63 }
View Code

 

B:开计数数组,然后扫两遍,第一遍找 YAY!,第二遍找 WHOOPS

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 
27 int cnt[200],num[200];
28 string a,b;
29 int A,B;
30 
31 int main(){
32     cin >> a >> b;
33     for(int i = 0; i < a.size(); ++i){
34         cnt[a[i]]++;
35     }
36     for(int i = 0; i < b.size(); ++i){
37         num[b[i]]++;
38     }
39     for(int i = 1; i <= 128; ++i) if(cnt[i] && num[i]){
40         int t = min(cnt[i],num[i]);
41         A += t;
42         cnt[i] -= t;
43         num[i] -= t;
44     }
45     for(int i = 1; i <= 128; ++i) if(cnt[i]){
46         if(i < 97){
47             if(num[i + 32]){
48                 int t = min(cnt[i],num[i + 32]);
49                 B += t;
50                 cnt[i] -= t;
51                 num[i + 32] -= t;
52             }
53         }
54         else{
55             if(num[i - 32]){
56                 int t = min(cnt[i],num[i - 32]);
57                 B += t;
58                 cnt[i] -= t;
59                 num[i - 32] -= t;
60             }
61         }
62     }
63     printf("%d %d\n",A,B);
64     return 0;
65 }
View Code

 

C:开个记录位置的数组,模拟即可。注意long long。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 const int MAXN = 100010;
27 
28 int n,m,k;
29 int a[MAXN],b,cnt[MAXN];
30 int pos[MAXN];
31 
32 int main(){
33     scanf("%d%d%d",&n,&m,&k);
34     REP(i,n){
35         scanf("%d",&a[i]);
36         cnt[a[i]] = (i - 1) / k + 1;
37         pos[a[i]] = i;
38     }
39     ll ans = 0;
40     REP(i,m){
41         scanf("%d",&b);
42         ans += cnt[b];
43         if(pos[b] > 1){
44             int pre = a[pos[b] - 1];
45             swap(a[pos[b] - 1],a[pos[b]]);
46             swap(cnt[b],cnt[pre]);
47             swap(pos[b],pos[pre]);
48         }
49     }
50     cout << ans << endl;
51     return 0;
52 }
View Code

 

D:dp[i][j]表示已经过去i秒,自动扶梯上有j个人的概率。初始化dp[0][0] = 1.0

   (1) dp[i][j] = dp[i - 1][j] * (1 - p)   (j != n)

      dp[i][j] = dp[i - 1][j] (j == n)

   (2) dp[i][j] += dp[i - 1][j - 1] * p  (j > 0) 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const int INF = (1 << 30) - 1;
26 
27 int n,t;
28 double p;
29 double dp[2005][2005];
30 
31 int main(){
32     cin >> n >> p >> t;
33     dp[0][0] = 1;
34     REP(i,t){
35         for(int j = n; j >= 0; --j){
36             if(j < n) dp[i][j] += dp[i - 1][j] * (1.0 - p);
37             else dp[i][j] = dp[i - 1][j];
38             if(j) dp[i][j] += dp[i - 1][j - 1] * p;
39         }
40     }
41     double ans = 0;
42     REP(i,n){
43         ans += (double)i * dp[t][i];
44     }
45     printf("%.10f\n",ans);
46     return 0;
47 }
View Code

 

E:考数学,首先这是一个移动的宽的k的框,向右移动的同时保证框内数的和递增,那么其实就是a(i),a(k+i),a(2k+i),a(3k+i)... 递增,其实就是按照mod k 的值分组

   那么对于每个组,要使的里面的数递增。我们逐个考虑每一对相邻的非问号数,比如a[i] , a[j] (i<j),那么它们之间要么没有数,要么全是问号。

   然后,为了保证总绝对值和最小,我们进行分类讨论(1)a[i] >= 0 且 a[j] >= 0 (2)a[i] < 0 且 a[j] < 0 (3)其余  这三种情况即可,注意细节。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <cmath>
 5 #include <vector>
 6 #include <map>
 7 #include <set>
 8 #include <stack>
 9 #include <queue>
10 #include <string>
11 #include <iostream>
12 #include <algorithm>
13 using namespace std;
14 
15 #define MEM(a,b) memset(a,b,sizeof(a))
16 #define REP(i,n) for(int i=1;i<=(n);++i)
17 #define REV(i,n) for(int i=(n);i>=1;--i)
18 #define FOR(i,a,b) for(int i=(a);i<=(b);++i)
19 #define RFOR(i,a,b) for(int i=(a);i>=(b);--i)
20 #define getmid(l,r) ((l) + ((r) - (l)) / 2)
21 #define MP(a,b) make_pair(a,b)
22 
23 typedef long long ll;
24 typedef pair<int,int> pii;
25 const ll INF = 1LL << 35;
26 const int MAXN = 200010;
27 
28 int n,k;
29 ll a[MAXN];
30 
31 void Run(int pre,int nxt){
32     if(nxt - pre <= k) return;
33     ll bot = pre < 1 ? -INF : a[pre];
34     ll top = nxt > n ? INF : a[nxt];
35     int d = (nxt - pre) / k - 1;
36     int t = d / 2;
37     if(t >= top)    a[pre + k] = top - d;
38     else if(-t <= bot)  a[pre + k] = bot + 1;
39     else    a[pre + k] = -t;
40     for(int i = pre + k + k; i < nxt && i <= n; i += k)
41         a[i] = a[i - k] + 1;
42 }
43 
44 bool Solve(){
45     REP(i,k){
46         int j,st = 0,ed = 0,pre = 0,nxt = 0;
47         for(j = i; j <= n; j += k){
48             if(a[j] != INF){
49                 if(pre == 0) pre = j;
50                 else nxt = j;
51                 if(st == 0) st = j;
52                 ed = j;
53             }
54             if(pre && nxt){
55                 if(a[nxt] - a[pre] < (nxt - pre) / k)   return false;
56                 Run(pre,nxt);
57                 pre = nxt;
58                 nxt = 0;
59             }
60         }
61         if(st) Run(i - k,st),Run(ed,j);
62         else Run(i - k,j);
63     }
64     return true;
65 }
66 
67 int main(){
68     char s[20];
69     scanf("%d%d",&n,&k);
70     REP(i,n){
71         scanf("%s",s);
72         if(s[0] == '?') a[i] = INF;
73         else a[i] = atoi(s);
74     }
75     if(!Solve()){
76         printf("Incorrect sequence\n");
77         return 0;
78     }
79     REP(i,n - 1) printf("%d ",a[i]);
80     printf("%d\n",a[n]);
81     return 0;
82 }
View Code

 

F:待补...

posted @ 2015-02-25 15:47  Naturain  阅读(103)  评论(0编辑  收藏  举报