过去几天我一直在疯狂地试图找出这个座位分配问题,并想知道是否有人可以帮助我。
说明说:
假设一组n名学生一起到达课堂(或电影),并且确切地将n个座位连续地分成1排。考虑到座位的偏好,您需要确定学生可以坐多少人来满足偏好。
输入
输入将仅来自键盘。输入将包含多个测试用例。每个测试用例以两个整数0 <0开始。 n和0≤m,其中n是要坐的学生人数,m是首选项的数量。为简单起见,假设学生从0到n-1编号。然后在m行之后,每行描述一个偏好,其中一行由三个整数a,b和c组成,满足0≤a<1。 b&lt; n和0 < | C | &LT; ñ。如果c为正,则青少年a和b想要坐在最多的c座位上。如果c为负数,那么a和b想要至少坐在-c个座位上。输入的结束由包含n = m = 0的行发出信号。
输出
每个测试用例的输出是一行,包含满足所有输入约束的组的可能的座位排列数。
示例输入
3 1
0 1 -2
3 0
0 0
示例输出
2
6
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
#include <iterator>
using namespace std;
struct Preference
{
int a;
int b; //Struct with three preferences
int c;
};
int main()
{
int a,b,c,students,numpref;
int count = 0;
vector<Preference> prefs; //Vector with struct to store preferences
Preference case1;
cout<<"Enter number of students and preferences: ";
cin>>students>>numpref; //Total Number of students and preferences are entered
for(int i = 0; i<=numpref; i++)
{
cin>>case1.a>>case1.b>>case1.c;
prefs.push_back(case1); //Stores preferences in vector
cout<<endl;
}
vector<int> v2(a); //Second vector created to store list of students
sort(v2.begin(), v2.end());
while(next_permutation(v2.begin(), v2.end()))
//Finds all permutations of student seating
{
}
system("PAUSE");
return 0;
}
我知道它不完整,但我主要试图弄清楚如何将每行首选项与正确的排列进行比较,然后计算结果。我考虑将用户放置的向量中的每个元素的位置作为输入(例如:在示例中为0,1),并检查找到的每个排列是否具有0和1,它们之间至少有2个座位。但那只是行不通。
答案 0 :(得分:1)
你认为算法可以工作,但速度很慢。我在你的不完整代码中发现了一些错误。
for(int i = 0; i<=numpref; i++)
我认为这应该是
for(int i = 0; i<numpref; i++)