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 }
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 }
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 }
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 }
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 }
F:待补...