CodeForces 471C MUH and House of Cards
2015-03-18 21:52
204 查看
看题目的Hint 图形就知道题意了,对着图形,稍微观察一下就会发现,每一层需要的卡牌数目为 2 * n + (n - 1)个,然后大致就有个思路,暴力枚举,但是仅仅这样没法子枚举,这个公式 只代表其中一层,不可能对每一层都枚举吧,可以化简一下 公式就是 3 * n - 1,这样就会发现 每次差1就是3的倍数了,然后每一层都差1,如果有i层的话,那么其实就是差了i,这样就很容易想到了,假设共有卡牌 x张,其实 就是枚举 i ,有多少个i 使得
(x + i)%3 == 0,这样就简单了,但是还有个限制的,因为 搭建i层 至少需要的牌数要知道,布恩那个超过x张,这里又得多画画找找,后来发现 搭建i层 至少需要 (3 * i + 1)* i/2张卡牌,这样 就很容易确定枚举范围了,而且 答案不大,所以直接枚举答案没事
题目链接:戳这里
做完觉得有点取巧,万一答案很大不就完了,于是乎去看看别人怎么做的,发现了更好的方法,其实 每一层 差1 就是3的倍数,那么相当于,每一层减去2就是3的倍数,这样就不是 枚举 (x + i)%3 == 0了,可以往下 枚举 (x - 3 * (j - 1) - 2 * j)%3 == 0;这样就不用考虑上限了,减少了找公式的时间
(x + i)%3 == 0,这样就简单了,但是还有个限制的,因为 搭建i层 至少需要的牌数要知道,布恩那个超过x张,这里又得多画画找找,后来发现 搭建i层 至少需要 (3 * i + 1)* i/2张卡牌,这样 就很容易确定枚举范围了,而且 答案不大,所以直接枚举答案没事
题目链接:戳这里
做完觉得有点取巧,万一答案很大不就完了,于是乎去看看别人怎么做的,发现了更好的方法,其实 每一层 差1 就是3的倍数,那么相当于,每一层减去2就是3的倍数,这样就不是 枚举 (x + i)%3 == 0了,可以往下 枚举 (x - 3 * (j - 1) - 2 * j)%3 == 0;这样就不用考虑上限了,减少了找公式的时间
ll n; void init() { } bool input() { while(cin>>n) { return false; } return true; } void cal() { ll ans = 0ll; for(ll k = 1;;k++) { if(n < (3 * k + 1) * k / 2) break; if((n + k)%3 == 0)ans++; } cout<<ans<<endl; } void output() { } int main() { while(true) { init(); if(input())return 0; cal(); output(); } return 0; }
相关文章推荐
- codeforces 258B Little Elephant and Elections 数位DP+DFS
- CodeForces 534F Simplified Nonogram (记忆化搜索)
- Codeforces 6225B KMP
- Codeforces 115A. Party
- CodeForces - 729D(思路)
- CodeForces 158 A.Next Round(水~)
- CodeForces-884D:Boxes And Balls(合并石子)
- codeforces 166?
- Codeforces 492E Vanya and Field(拓展欧几里得)
- Codeforces 653C Bear and Up-Down 【模拟】
- Codeforces 707D.Persistent Bookcase(离线算法,dfs树,好题!)
- CodeForces 776D The Door Problem【并查集】
- CodeForces 22b_Bargaining Table_dp(暴力)
- codeforces 82A Double Cola
- [代码]codeforces 274B Zero Tree
- 【贪心】Codeforces 353E Antichain
- codeforces 598C C. Nearest vectors(极角排序)
- Codeforces- 124B-Permutations (深搜找全排列以及取出一个数的每一位)
- Codeforces 583C GCD Table【贪心】
- CodeForces - 822C Hacker, pack your bags!(区间端点处理技巧+思维)