キャンパス活動
タイトルリンク:nowcoder 215070
Niu Keへ:
トピック
たくさんの数字があり、各セグメントの値の合計が同じになるように、それらをできるだけ多くのセグメントに分割する必要があります。
分割できるセグメントの最大数を出力しますが、1つのグループにしか分割できない場合(つまり、全員が同じグループに属している場合)は-1を出力します。
アイデア
この質問を行うためにシミュレーションを使用します。
すべての値の合計が小さいため、小さいものから大きいものへと直接列挙される各セグメントの数の合計を考慮します。
次に、問題がないかどうかを判断して出力します。すべての値の合計が小さいほど、セグメントの数が多くなります。
コード
#include<cstdio>
using namespace std;
int n, a[1001], r, sum;
bool all0 = 1;
char c;
bool work(int now) {
//从左往右扫,区间值的和等于要求的就到下一个区间
sum = 0;
for (int i = 1; i <= n; i++) {
sum += a[i];
if (sum > now) return 0;//无法组成,会超过
else if (sum == now) sum = 0;
}
return 1;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
c = getchar();
while (c < '0' || c > '9') c = getchar();
a[i] = c - '0';
if (all0 && a[i]) all0 = 0;
r += a[i];
}
if (all0) {
printf("%d", n);
return 0;
}
for (int i = 1; i <= r >> 1; i++)//枚举长度
if (r % i == 0) {
//起码要能整除,不然不可能均分
if (work(i)) {
printf("%d", r / i);//如果此长度可行,输出这个长度能分成的段数
return 0;
}
}
printf("-1");
return 0;
}