牛客OI测试赛 C 序列 思维
链接:https://www.nowcoder.com/acm/contest/181/C
来源:牛客网
题目描述
小a有n个数,他想把他们划分为连续的权值相等的k段,但他不知道这是否可行。
每个数都必须被划分
这个问题对他来说太难了,于是他把这个问题丢给了你。输入描述:
第一行为两个整数n,q,分别表示序列长度和询问个数。
第二行有n个数,表示序列中的每个数。
接下来的q行,每行包含一个数k,含义如题所示。
输出描述:
输出q行,每行对应一个数Yes或者No,分别表示可行/不可行
备注:
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510332779_equation?tex=n%20%5Cleqslant%2010%2Cq%20%5Cleqslant%2020)
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510345806_equation?tex=n%20%5Cleqslant%202000%2Cq%20%5Cleqslant%202000)
对于
的数据,![](https://uploadfiles.nowcoder.com/files/20180829/306625_1535510361523_equation?tex=n%20%5Cleqslant%20100000%2Cq%20%5Cleqslant%201000000)
设ai表示数列中的第i个数,保证![](https://uploadfiles.nowcoder.com/files/20180822/306625_1534908297281_equation?tex=%5Csum%20a_i%20%5Cleqslant%2010%5E%7B13%7D)
保证数据完全随机
分析:
![](https://images2018.cnblogs.com/blog/1124997/201808/1124997-20180830110120894-1013313224.png)
AC代码:
#include <map> #include <set> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <vector> #include <string> #include <bitset> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> #define ls (r<<1) #define rs (r<<1|1) #define debug(a) cout << #a << " " << a << endl using namespace std; typedef long long ll; const ll maxn = 1e5 + 10; const double eps = 1e-8; const ll mod = 1e9 + 7; const ll inf = 1e9; const double pi = acos(-1.0); ll a[maxn]; int main() { std::ios::sync_with_stdio(false); ll n, q, sum = 0; scanf("%lld%lld",&n,&q); for( ll i = 0; i < n; i ++ ) { scanf("%lld",&a[i]); sum += a[i]; } while( q -- ) { ll k; scanf("%lld",&k); if( sum%k || k > n ) { printf("No\n"); continue; } ll ans = 0, avg = sum/k, cnt = 0; bool flag = false; for( ll i = 0; i < n; i ++ ) { ans += a[i]; //最后可能加上0,而0可以合并到前面区间,所以用ans=0来判断 //开始用flag判断最后一位是否刚好可以让ans=avg,判断错了 if( ans == avg ) { ans = 0; cnt ++; } } if( ans == 0 && cnt == k ) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }
彼时当年少,莫负好时光。