【问题标题】:vector variable inside for loopfor循环内的向量变量
【发布时间】:2021-09-10 07:21:59
【问题描述】:

我在循环内为测试用例定义了一个空向量变量,在执行每个测试用例后,我希望向量会变空,但它也存储了早期测试用例的先前结果,请帮助谢谢很多。

我的问题陈述是this.,输入为:

  • 输入的第一行包含一个整数 T,表示测试用例的数量。 T测试用例的描述如下。

  • 每个测试用例的第一行包含一个整数 N。

  • N 行紧随其后。对于每个有效的 i,这些行的第 i 个包含一个字符串 S3,i 后跟一个空格和一个整数 C3,i — 问题代码和正确解决方案的数量 在第三师的第i个问题上。

  • 接下来还有 N 行。对于每个有效的 i,这些行的第 i 行包含一个字符串 S2,I 后跟一个空格和一个整数 C2,i — 问题代码和正确解决方案的数量 关于第二师的第i个问题。

  • 最后,后面还有 N 行。对于每个有效的 i,这些行中的第 i 行包含一个字符串 S1,i 后跟一个空格和一个 整数 C1,i — 问题代码和正确数 第 i 个问题的解。

目标: Codechef 挑战分为三个部分。在一个挑战中,每个部门有 N 个问题,但有些问题可能会在多个部门之间共享。每个问题都由一个代码唯一标识——一个只包含大写英文字母的字符串。每个参赛者只能在其中一个部门提交。

Chef 想要找出所有 3 个部门中每个问题的正确解决方案的总数。给定一个包含 N 个问题代码的列表,其中包含每个分区中每个问题的正确解决方案的数量,找出每个问题的正确解决方案的总数,并将它们按非递减顺序排序。

我的代码以input 为:

3
1
A 1
B 2
C 3
2
AA 1
AB 1
AB 1
AC 1
AC 1
AD 1
1
Z 100
Z 100
Z 100

预期的output 是:

1 2 3
1 1 2 2
300

但我的输出有错误:

1 2 3 
1 1 1 2 2 2 3 
1 1 1 2 2 2 3 300 

我的上述问题的代码是:

#include <iostream>
#include<map>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;


int main() {
    map<string,int>m;
    int t,n,c_1;
    string s_1;
    cin>>t;
    for(int i=0;i<t;i++){
        cin>>n;
        for(int k=0;k<3;k++){
            for(int j=0;j<n;j++){
                cin>>s_1;
                cin>>c_1;
                m[s_1]+=c_1;
            }
        }
        vector<int>v;
        for(auto x :m){
            v.push_back(x.second);
        }
        sort(v.begin(),v.end());
        for(auto y: v){
            cout<<y<<" ";
        }
        cout<<"\n" ;
    }
return 0;
}

【问题讨论】:

  • 但它存储了早期测试用例的先前结果 -- 最简单的解决方案 -- 创建一个名为 test() 的函数并调用该函数,而不是将所有内容都塞进里面的main。那么一切都是test()本地的,不会污染其他测试用例。
  • @Rajakr 神奇的数字 3 在这里做什么 for(int k=0;k
  • @VladfromMoscow sir 3 用于输入 3 次 n,在链接中提到,我也应该写完整的问题吗?
  • @Rajakr 你应该提供一个最小的完整程序来演示这个问题。
  • @VladfromMoscow 我已经编写了完整的代码并添加了问题的输入格式

标签: c++ dictionary vector stl


【解决方案1】:

您的 vector (v) 在每次运行外部 for 循环时都会被重置(为空),但您的 map (m) 是不。那就是每次都保留它的内容,并且你的新输入被附加到它上面。因此,您的 for (auto x : m) { 将每个前一个循环中的数据附加到您的(最初为空的)向量中。

map&lt;string, int&gt;m; 的声明移动到内部该外部循环以解决您的问题:

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string>

using std::cin, std::cout;
using std::string;
using std::map;
using std::vector;
using std::sort;

int main()
{
    int t, n, c_1;
    string s_1;
    cin >> t;
    for (int i = 0; i < t; i++) {
        map<string, int>m; // Move the map to here, so it's created afresh for each loop.
        cin >> n;
        for (int k = 0; k < 3; k++) {
            for (int j = 0; j < n; j++) {
                cin >> s_1;
                cin >> c_1;
                m[s_1] += c_1;
            }
        }
        vector<int>v;
        for (auto x : m) {
            v.push_back(x.second);
        }
        sort(v.begin(), v.end());
        for (auto y : v) {
            cout << y << " ";
        }
        cout << "\n";
    }
    return 0;
}

或者,您可以每次都使用相同的映射,并在每次运行外循环时重置(清除)它,方法是在该循环的第一行添加 m.clear();

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    相关资源
    最近更新 更多