您的位置:首页 > 其它

单挑养成计划【3】 AtCoder Grand Contest 003

2016-10-27 18:34 357 查看

B - Simplified mahjong

题意:有一组面值为1~N的牌,已知每种面值的个数,卡牌a,b可以组成一对(a, b)当且仅当|a面值 - b面值|<=1。问最多能组多少对。

题解: 没什么好说的,贪心O(n)扫一遍就好。需要注意的是三张相邻面值的卡牌分别有1 2 1张,这种情况可以组成两对。贪心的姿势一定要选对。

1 #include <cstdio>
2 #include <cstdlib>
3 #include <cstring>
4 #include <algorithm>
5 #include <iostream>
6 #include <vector>
7 #include <queue>
8 using namespace std;
9 typedef  long long  ll;
10 const int maxn = 2e5 + 5;
11 int n, q;
12 ll a, t[maxn], ans[maxn];
13 vector<ll> v;
14 int main() {
15     scanf("%d %d",&n,&q);
16     v.push_back(n);//!!!
17     for (int i=0; i<q; i++) {
18         scanf("%lld",&a);
19         while (v.size() && v.back() >= a)
20             v.pop_back();
21         v.push_back(a);
22     }
23     //for (int i=0; i<v.size(); i++) cout<<v[i]<<"  ";
24     t[v.size() - 1] = 1;
25     for (int i=v.size()-1; i>=0; i--) {
26         ll k = v[i];
27         //cout<<endl<<i<<" : \n";
28         while (k > v[0]) {
29             int j = lower_bound(v.begin(), v.end(), k) - (v.begin() + 1);
30             t[j] += k / v[j] * t[i];
31             //cout<<k<<" "<<j<<" : "<<v[j]<<" "<<t[j]<<" "<<t[i]<<endl;
32             k %= v[j];
33         }
34         ans[k] += t[i];
35     }
36     for (int i=n-1; i>=1; i--) ans[i] += ans[i+1];
37     for (int i=1; i<=n; i++)
38         printf("%lld\n", ans[i]);
39     return 0;
40 }


View Code

F - Fraction of Fractal

我尽力了。。读不懂题。。。、、
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: