C ++总初学者需要指导

时间:2013-10-11 13:13:12

标签: c++

昨天,我们不得不在代码竞赛中解决问题 因为我是一个初学者,所以我无法解决这个问题。

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;
    }  
} 

2 个答案:

答案 0 :(得分:1)

正如Angew所说,返回陈述不正确并导致您退出主要。你想用 break; 替换它来退出循环而不是函数。

答案 1 :(得分:0)

我没有花费精力去理解你的算法,但乍一看它看起来比它应该更复杂。

根据我对问题的理解,有三种可能性:

  • 上半部分和下半部分的总数已经是均匀的(所以不需要做任何事情)
  • 上半部和下半部的总数不能均匀(因此不存在解决方案)
  • 只需要旋转一个Domino就可以获得上半部分和下半部分的总数(所以所需的时间是1秒)

我的基础是这样一个事实,即只添加偶数数字总能产生均匀的结果,并且添加偶数个奇数也总能得到均匀的结果。

基于此,我将维护2个不同的数组 - 一个用于上半部分数字,另一个用于下半部分数字,而不是像代码中那样使用二维数组。另外,我会编写以下两个辅助函数:

  1. oddNumCount - 将数组作为输入;只返回数组中奇数的数量。
  2. oddAndEvenTileExists - 将2个数组作为输入;返回带有奇数+偶数组合的第一个图块的索引,如果不存在这样的图块,则返回-1。
  3. 然后算法的核心是:

    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”函数返回的索引。

    您可以自己编写实际代码以测试其是否有效。即使它没有,你也会编写一些代码,希望能让你略高于“初学者”。