http://codeforces.com/contest/353/problem/A
我使用了这个算法,但它有些问题。我认为它应该打印s或f,但它什么都不打印。它只是自动关闭。即使我添加了一个输入来停止即时关闭
#include <cstdlib>
#include <iostream>
using namespace std;
int main(){
int y=0;
int x=0;
int f;
int a;
cin >> a;
int s;
s = 0;
int number [a][a];
for(int i = 0;i<a;i++){
cin >> number[i][0] >> number[i][1];
x += number[i][0];
y += number[i][1];
}
for(int i = 0;i<a;i++){
if(x%2==0 && y%2==0){
return s;
}else if(y%2!=0 && x%2==0){
f = -1;
return f;
}else if(y%2==0 && x%2!=0){
f = -1;
return f;
}else{
y+= number[i][0];
x+= number[i][1];
s++;
}
}
int g;
if(f!=-1){
cout << s;
}else{
cout << f;
}
}
答案 0 :(得分:1)
正如Angew所说,返回陈述不正确并导致您退出主要。你想用 break; 替换它来退出循环而不是函数。
答案 1 :(得分:0)
我没有花费精力去理解你的算法,但乍一看它看起来比它应该更复杂。
根据我对问题的理解,有三种可能性:
我的基础是这样一个事实,即只添加偶数数字总能产生均匀的结果,并且添加偶数个奇数也总能得到均匀的结果。
基于此,我将维护2个不同的数组 - 一个用于上半部分数字,另一个用于下半部分数字,而不是像代码中那样使用二维数组。另外,我会编写以下两个辅助函数:
然后算法的核心是:
if (((oddNumCount(upper_half_array) % 2) == 0) && ((oddNumCount(lower_half_array) % 2) == 0))
{
// nothing needs to be done
result = 0;
}
else if (((oddNumCount(upper_half_array) - oddNumCount(lower_half_array)) % 2) == 0)
{
// The difference between the number of odd numbers in the two halves is even, which means a solution may exist.
// A solution really exists only if there exists a tile in which one number is even and the other is odd.
result = (oddAndEvenTileExists(upper_half_array, lower_half_array) >= 0) ? 1 : -1;
}
else
{
// no solution exists.
result = -1;
}
如果您想确切指出需要旋转哪个图块,则可以保存“oddAndEvenTileExists”函数返回的索引。
您可以自己编写实际代码以测试其是否有效。即使它没有,你也会编写一些代码,希望能让你略高于“初学者”。