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 }
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 }
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 }
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 }
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 }