CF #200 div2 虚拟赛

2014-10-24 02:09:31

晚上开完Linux教程会就兴致勃勃的来打了场以前的cf,比赛中搞了4题,最后一题搞到2点才出来QAQ(其实就是个二分)

A:算块数。

 1 /*************************************************************************
 2     > File Name: a.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 23 Oct 2014 08:11:17 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n,cnt,pre;
28 char s[5];
29 
30 int main(){
31     pre = -1;
32     cnt = 0;
33     scanf("%d",&n);
34     for(int i = 1; i <= n; ++i){
35         scanf("%s",s);
36         if(s[0] == '0'){
37             if(pre == 0 || pre == -1) ++cnt;
38             pre = 1;
39         }
40         else{
41             if(pre == 1 || pre == -1) ++cnt;
42             pre = 0;
43         }
44     }
45     printf("%d\n",cnt);
46     return 0;
47 }
View Code

B:判断下就行,较小的两个加起来 - 最大的,如果为奇数 or 负数就不行。

 1 /*************************************************************************
 2     > File Name: bb.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Sat 25 Oct 2014 11:30:17 AM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int main(){
28     int a,b,c;
29     scanf("%d%d%d",&a,&b,&c);
30     if(a + b - c < 0 || a + c - b < 0 || b + c - a < 0 || (a + b - c) % 2)
31         printf("Impossible\n");
32     else
33         printf("%d %d %d\n",(a + b - c) / 2,(b + c - a) / 2,(a + c - b) / 2);
34     return 0;
35 }
View Code

C:贪心题,分析一下就可以知道串联比较合算,所以尽量串联。如果a/b >= 1,则整数部分用串联得到,小数部分这样处理:如现在要得到 a / b (a < b),那么为了尽量省,我们用的是1 和 a / (b - a) 并联得到,再判断a / (b - a) 是否 >= 1,如此循环处理下去即可。当然中间不能纯模拟,要用除法加速。(最后,我们发现,其实遇到 a / b >= 1的情况,只要翻转一下,求b / a即可,思考一下)

 1 /*************************************************************************
 2     > File Name: c.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 23 Oct 2014 08:33:46 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 ll a,b,k;
28 ll ans;
29 
30 int main(){
31     ans = 0;
32     scanf("%I64d %I64d",&a,&b);
33     while(1){
34         if(a > b){
35             k = a / b;
36             ans += k;
37             a -= k * b;
38         }
39         else{
40             k = b / a;
41             ans += k;
42             b -= k * a;
43         }
44         if(a == 0 || b == 0) break;
45     }
46     printf("%I64d\n",ans);
47     return 0;
48 }
View Code

D:STL题,话不多,直接用栈模拟即可。

 1 /*************************************************************************
 2     > File Name: d.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Thu 23 Oct 2014 09:36:43 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 const int INF = 1 << 30;
26 
27 int n;
28 char s[100010];
29 stack<int> S;
30 
31 int main(){
32     scanf("%s",s);
33     int len = strlen(s),id,v;
34     while(!S.empty()) S.pop();
35     for(int i = 0; i < len; ++i){
36         id = s[i] == '-' ? 0 : 1;
37         if(!S.empty()){
38             v = S.top();
39             if(v == id) S.pop();
40             else S.push(id);
41         }
42         else S.push(id);
43     }
44     if(S.empty()) printf("Yes\n");
45     else printf("No\n");
46     return 0;
47 }
View Code

E:二分答案+贪心判断。这题卡我好久QAQ。

做法:首先二分时间,然后判断该时间是否可行。判断:开一个计数器 i,记录当前考虑第i个p(为p[i]),逐个考虑每个h,若当前h走不到p,则考虑下个h;若能走到p,那么考虑:h要尽可能覆盖到右边的位置,这样才最划算。比如p在4位置,h在5位置,时间为7,那么如果h先到p再一直向右,可以到达最右点10;如果h先向右再返回向左走到p,可以到达最右点8。机智的人已经看出来了:要考虑 max(p + t - abs(p - h) , h + (t - abs(p - h)) / 2),然后用max去更新 i,一直到max不能覆盖到p[i]。

 1 /*************************************************************************
 2     > File Name: e.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com
 5     > Created Time: Thu 23 Oct 2014 11:57:41 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 #define Abs(a) ((a) < 0 ? (-(a)) : (a))
25 typedef long long ll;
26 const int INF = 1 << 30;
27 const int maxn = 100010;
28 
29 int n,m;
30 ll h[maxn],p[maxn];
31 
32 bool Solve(ll t){
33     int i = 1,j = 1;
34     ll tmax,tmp;
35     for(; i <= n; ++i){
36         if((tmp = Abs(p[j] - h[i])) > t)
37             continue;
38         tmax = max(h[i] + (t - tmp) / 2,p[j] + t - tmp);
39         while(j <= m && p[j] <= tmax)
40             ++j;
41         if(j > m) break;
42     }
43     if(j > m) return true;
44     return false;
45 }
46 
47 
48 int main(){
49     scanf("%d%d",&n,&m);
50     for(int i = 1; i <= n; ++i)
51         scanf("%I64d",&h[i]);
52     for(int i = 1; i <= m; ++i)
53         scanf("%I64d",&p[i]);
54     ll l = 0,r = h[n] + p[m],mid,ans = 0;
55     while(l < r){
56         mid = getmid(l,r);
57         if(Solve(mid)){
58             ans = mid;
59             r = mid;
60         }
61         else l = mid + 1;
62     }
63     printf("%I64d\n",ans);
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/naturepengchen/articles/4047298.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值