Codeforces Round #269 (Div. 2) solution

A.MUH and Sticks

题意:给你6根棍子,问你能否拼出熊或者象。要拼出熊首先要有4个长度一样的棍子当腿,另外2个长度不同的棍子当身体和脑袋。拼大象也需要4个长度一样的棍子当腿,但需要另外2个长度相同的棍子当身体和脑袋。
解法:详见代码。
代码:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <set>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 int m[11];
 8 
 9 int main() {
10     int a;
11     for(int i = 0; i < 6; i++) { scanf("%d", &a); m[a]++; }
12     int f = 0;
13     for(int i = 1; i <= 9; i++) { if(m[i] >= 4) m[i] -= 4, f = 1; }
14     if(!f) { printf("Alien\n"); return 0; }
15     for(int i = 1; i <= 9; i++) { if(m[i] >= 2) f = 0; }
16     if(!f) printf("Elephant\n");
17     else printf("Bear\n");
18 
19     return 0;
20 }
View Code

 

B.MUH and Important Things

题意:给你一些任务,每个任务有一个难度。问你这些任务按照难度排序能否排出至少3个不同的序列。

解法:显然若有3个或以上任务难度相同我们就可以构造出答案,若没有3个任务难度相同有两组2个难度相同的任务也可构造出答案,否则无解。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <set>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 pair<int, int> a[2010];
 8 int o[3][2010], n;
 9 
10 void ot() {
11     printf("YES\n");
12     for(int i = 0; i < 3; i++) {
13         for(int j = 0; j < n; j++) printf("%d%c", o[i][j], j == n - 1 ? '\n':' ');
14     }
15 }
16 
17 int main() {
18     int k = 1;
19     scanf("%d", &n);
20     for(int i = 0; i < n; i++) {
21         scanf("%d", &a[i].first);
22         a[i].second = i + 1;
23     }
24     sort(a, a + n);
25     for(int i = 0; i < n; i++)  o[0][i] = o[1][i] = o[2][i] = a[i].second;
26     for(int i = 0; i < n - 1; i++) {
27         if(i + 2 < n && a[i].first == a[i + 1].first && a[i + 2].first == a[i + 1].first) {
28             o[1][i] = a[i + 1].second, o[1][i + 1] = a[i].second;
29             o[2][i] = a[i + 2].second, o[2][i + 2] = a[i].second;
30             ot();
31             return 0;
32         } else if(a[i].first == a[i + 1].first){
33             o[k][i] = a[i + 1].second, o[k][i + 1] = a[i].second;
34             k++;
35             if(k == 3) {
36                 ot();
37                 return 0;
38             }
39         }
40     }
41     printf("NO\n");
42 
43     return 0;
44 }
View Code

 

C.MUH and House of Cards
 题意:用牌来搭房子,上面一层的房间数要小于下面一层。现在给你牌的数量,问你房子可能的层数有多少种,详见图。
解法:我们观察可以发现每层需要的牌数为2 + 3 * k,k为房子数-1。那么我们可以枚举层数,然后判断能否满足题目要求,即下面一层的k至少要是上面一层的k+1,详见代码。
代码:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <set>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 pair<int, int> a[2010];
 8 int o[3][2010], n;
 9 
10 int main() {
11     long long n, k = 1, l = 0;
12     scanf("%I64d", &n);
13     int ans = 0;
14     for(;;k++) {
15         long long m = n;
16         m -= 2 * k;
17         if(m % 3 != 0) { l += k; continue; }
18         m /= 3;
19         if(m >= l) ans++;
20         else break;
21         l += k;
22     }
23     printf("%d\n", ans);
24 
25     return 0;
26 }
View Code

 

 

转载于:https://www.cnblogs.com/shiina-mashiro/p/4000029.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值