Codeforces Round #219 (Div. 2) 解题报告

Problem A Collecting Beats is Fun

题意:就是音乐游戏在4*4的网上一些格子需要在固定的时间点,告诉你一只手同一时间能点几个。问你能不能通关(就是一个不丢)

思路:水题 。我开了一个数组统计一下每个时间出现的格子数。最后扫一遍判断有没有不能点完的就OK了

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <queue>
 8 #include <vector>
 9 #include <stack>
10 #define INF 0x7fffffff
11 #define ll long long
12 #define eps 1E-6
13 
14 using namespace std;
15 
16 int main()
17 {
18 //    freopen("in.txt", "r", stdin);
19     int n, cnt[11];
20     while(scanf("%d", &n)!=EOF){
21         memset(cnt, 0, sizeof cnt);
22         for(int i=0; i<4; i++){
23             for(int j=0; j<4; j++){
24                 char temp;
25                 cin >> temp;
26                 if(temp!='.') cnt[temp-'0']++;
27             }
28         }
29         int ans = 1;
30         for(int i=0; i<10; i++){
31             if(cnt[i]>2*n)ans = 0;
32         }
33         if(ans) cout << "YES" << endl;
34         else cout << "NO" << endl;
35     }
36     return 0;
37 }
View Code

Problem B Making Sequences is Fun

题意:给你一个m你要找(m,m+1,。。。)这个数列。每往这个数列中加入一个数花费是S(x)*k,S(x)表示数字的位数,问你最长能加多少个数?

思路:我用的方法很暴力,首先看m为几位数假设为a位,那么看看把a位中比m大的全部加进来,若不行那直接算出来多少个数。若可以加则从a+1开始枚举,直到剩下来的费用已经不能把b位的数全加进来了。这是在算一下b位的书能加几个就OK了。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <utility>
 8 #include <queue>
 9 #include <vector>
10 #include <stack>
11 #define INF 0x7fffffff
12 #define ll long long
13 #define eps 1E-6
14 
15 using namespace std;
16 
17 ll w, m ,k, ans, cost[30];
18 
19 ll Pow(ll a, ll b){
20     ll ret = 1;
21     while(b--){
22         ret*=a;
23     }
24     return ret;
25 }
26 
27 int main()
28 {
29 //    freopen("in.txt", "r", stdin);
30 
31     memset(cost, 0, sizeof cost);
32     for(ll i=1; i<21; i++){
33         cost[i] = Pow(10, i);
34         for(int j=1; j<i; j++){
35             cost[i]-=cost[j];
36         }
37     }
38     while(cin >> w >> m >> k){
39         ll mon = w/k;
40         ll ii;
41         for(ii=1; ii<20; ii++){
42             if(Pow(10, ii)>m)break;
43         }
44         ll cc = (Pow(10, ii)-m)*ii, ans = 0;
45         if(mon<=cc) ans = mon/ii;
46         else{
47             mon-=cc;
48             ans+=Pow(10, ii)-m;
49             while(mon>0){
50                 ++ii;
51                 if(cost[ii]*ii<=mon){
52                     mon-=cost[ii]*ii;
53                     ans+=cost[ii];
54                 }else break;
55             }
56             ans+=mon/ii;
57         }
58         cout << ans << endl;
59     }
60     return 0;
61 }
View Code

 Problem C Counting Kangaroos is Fun

题意:一个袋鼠可以装下另一个袋鼠当且仅当他的体重是另外一个的两倍。在袋鼠口袋里有东西的时候就不能再装别的东西或者被别的袋鼠装了,一个袋鼠被装了以后就看不见了。问你最少会看见多少只袋鼠?

思路:二分答案。每一次判断答案是否可行就是看前mid个是否能被后mid个装下(排序好的)。前两天在刷uva今天补上这一题。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <queue>
 6 #include <vector>
 7 #include <stack>
 8 #define LEN 1000100
 9 #define INF 0x7fffffff
10 #define eps 1e-6
11 #define ll long long
12 
13 using namespace std;
14 
15 int a[LEN], n;
16 
17 void debug()
18 {
19     for(int i=0; i<n; i++){
20         cout << a[i] << ' ';
21     }cout << endl;
22 }
23 
24 bool check(int pos){
25     for(int i=0; i<pos; i++){
26         if((2*a[i])>a[n-pos+i])return false;
27     }
28     return true;
29 }
30 
31 int main()
32 {
33     freopen("in.txt", "r", stdin);
34 
35     while(scanf("%d" ,&n)!=EOF){
36         for(int i=0; i<n; i++){
37             scanf("%d", &a[i]);
38         }
39         sort(a, a+n);
40         int l = 0, r = n/2;
41         while(l<r){
42             int mid = (l+r+1)/2;
43             if(check(mid))l = mid;
44             else r = mid-1;
45         }
46         cout << n-l << endl;
47     }
48     return 0;
49 }
View Code

 

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3473989.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值