Codeforces 872 C Maximum splitting(规律)

来源:互联网 发布:php txt教程下载 编辑:程序博客网 时间:2024/06/01 22:10

题目地址
题意:给你T个查询,每次查询告诉你个数字num,问这个数字最多能被几个合数相加组成。
思路:其实我们能发现,能用到的基础合数就是4,6,9,因为对于8来说你都可以用2个4去组成了,何必用一个8呢,所以我们就用4为底去求模。我们就会发现有这些情况:

  1. 余数为0,全部由4组成
  2. 余数为1,需要两个4去组成9,这样就牺牲了一个数
  3. 余数为2,需要一个4去组成6,这样就不会增加或者减少数
  4. 余数为3,需要三个4去组成一个9和一个6,这样就牺牲了一个数

坑点就是在于我们减一些数之前要判断他是不是有这么多4去操作,而不是直接减。

#include <iostream>#include <cstring>#include <string>#include <queue>#include <vector>#include <map>#include <set>#include <stack>#include <cmath>#include <cstdio>#include <algorithm>#define N 400010#define LL __int64#define inf 0x3f3f3f3f 0#define lson l,mid,ans<<1#define rson mid+1,r,ans<<1|1#define getMid (l+r)>>1#define movel ans<<1#define mover ans<<1|1const int mod = 1000000007;using namespace std;int main() {    cin.sync_with_stdio(false);    int T, num;    cin >> T;    while (T--) {        cin >> num;        int n = num % 4;        int m = num / 4;        if (n == 0) {            cout << m << endl;        }        else if (n == 1) {            if (m > 1) {                cout << m - 1 << endl;            }            else cout << -1 << endl;        }        else if (n == 2) {            if (m > 0) {                cout << m << endl;            }            else {                cout << -1 << endl;            }        }        else {            if (m > 2) {                cout << m - 1 << endl;            }            else {                cout << -1 << endl;            }        }    }    return 0;}
阅读全文
0 0
原创粉丝点击