Codeforces 870C Maximum splitting (贪心+找规律)
<题目链接>
题目大意:
给定数字n,让你将其分成合数相加的形式,问你最多能够将其分成几个合数相加。
解题分析:
因为要将其分成合数相加的个数最多,所以自然是尽可能地将其分成尽可能小的合数相加的形式。通过找规律,我们能够发现,所有的偶数都能够分成4和6这两个合数的组合,而所有的奇数,在减去9这个最小的奇合数后,就会变成偶数,然后就是和普通偶数一样的处理方式。
普通偶数的处理方式就是,看他能够分成几个4,如果该偶数不为4的倍数,那么就是将其中的一个4换成6。总的最大合数个数为:$n/4$
而奇数的个数为:$(n-9)/4+1 =n/4-1 $
对于那些比较小的数需要特判。
#include <bits/stdc++.h> using namespace std; int solve(int x){ if(x==1||x==2||x==3||x==5||x==7||x==11)return -1; //对比较小的数进行特殊考虑 int tmp=x/4-x%2; //进行奇偶的处理 return tmp?tmp:-1; } int main(){ int n; while(~scanf("%d",&n)){ while(n--){ int x;scanf("%d",&x); printf("%d\n",solve(x)); } } }
作者:is_ok
出处:http://www.cnblogs.com/00isok/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。