hdu 6794 Tokitsukaze and Multiple (贪心)

文章目录

      • 题目大意
      • 思路
      • 代码

题目链接

题目大意

给你n个数,和一个数p,求对n个数分割,最多有多少段的和为p的倍数

思路

计算前缀和模p,如果当前的前缀和模p的值,与前面某位置的前缀和模p的值相等,说明这一段的和是p的倍数,ans++,并将之前的“前缀和模p的值”清空,因为是连续的,所以后面肯定用不上了

代码

#include 

using namespace std;

int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, p, tmp, sum = 0, ans = 0;
        cin >> n >> p;
        set<int> st;
        st.insert(0);
        for (int i = 0; i < n; ++i) {
            scanf("%d", &tmp);
            sum = (sum + tmp) % p;
            if (st.count(sum)) {
                ans++;
                sum = 0;
                st.clear();
                st.insert(0);
            } else st.insert(sum);
        }
        cout << ans << endl;
    }
    return 0;
}

你可能感兴趣的:(基本思想)