题目链接:codeforces 1030C
题意:
给 n 个数字, 问能否将其分为多段,使每一段的和相等
题解:
模拟:将每一段都列出来,判断是否可能
AC代码:c++
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, a[105];
memset(a, 0, sizeof(a));
string s;
cin >> n;
cin >> s;
for(int i = 0; i < n; i++){
a[i] = s[i] - '0';
}
int f = 0, ans = 0, sum = 0, j = 0;
for(int j = 0; j < n; j++){
ans = ans + a[j]; // ans 为第一段的值
for(int i = j+1; i < n;){ // 判断之后的每一段是否等于 ans
while((sum < ans || a[i] == 0) && i < n){ // 如果和小于ans或者a[i] = 0
sum = sum + a[i]; // (等于0不影响结果)
i++;
}
if(ans == 0 && sum == ans){
sum = sum + a[i]; // 此段等于0
i++;
f = 1;
}
if(sum == ans){ // 如果相等
sum = 0; f = 1;
}
else{ // 不相等,下一次循环
sum = 0;
f = 0;break;
}
}
if(f){ // 某一次满足就可以
break;
}
}
if(f){
cout << "YES" << endl;
}
else{
cout << "NO" << endl;
}
return 0;
}
php
<?php
$cin = fopen("php://stdin", "r");
$n = intval(fgets($cin));
$s = fgets($cin);
$s = str_replace(PHP_EOL, '', $s);
$ans = 0;
$a = array();
for($i = 0; $i < $n; $i++){
$a[$i] = ord($s[$i])-ord('0');
}
$f = 0;
for($j = 0; $j < $n; $j++){
$sum = 0;
$ans += $a[$j];
for($i = $j+1; $i < $n; ){
while(($a[$i] == 0 || $sum < $ans) && $i < $n){
$sum += $a[$i];$i++;
}
if($ans == 0 && $sum == $ans){
$sum += $a[$i]; $i++; $f = 1;
}
if($ans == $sum){
$sum = 0; $f = 1;
}
else{
$sum = 0; $f = 0;break;
}
}
if($f == 1){
break;
}
}
if($f == 1){
print_r("YES"."\n");
}
else{
print_r("NO"."\n");
}
fclose($cin);
?>

本文详细解析了 Codeforces 平台上的题目 1030C 的解决思路,通过模拟算法判断一组数字是否能被划分为若干个和相等的子集,提供了 C++ 和 PHP 两种语言的实现代码。
451

被折叠的 条评论
为什么被折叠?



