题目链接:http://poj.org/problem?id=2947

题意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:

p start end
a1, a2......ap (1<= ai <= n)
第一行表示从星期 start 到星期 end 一共生产了p 件装饰物 (工作的天数为end - start + 1 + 7*x, 加 7*x 是因为它可能生产很多周),第二行表示这 p 件装饰物的种类(可能出现相同的种类,即 ai = aj)。规定每件装饰物至少生产3 天,最多生产9 天。问每种装饰物需要生产的天数。如果没有解,则输出“Inconsistent data.”,如果有多解,则输出“Multiple solutions.”,如果只有唯一解,则输出每种装饰物需要生产的天数。
 
思路:高斯消元接同模方程组
设每种装饰物需要生产的天数为 xi(1<=i<=n)。每一个条件就相当于给定了一个方程式,假设生产1 类装饰物 a1 件、2 类装饰物 a2 件、i 类装饰物 ai 件所花费的天数为 b = end - star + 1 + 7 * x,则可以列出下列方程:
a1 * x1 + a2 * x2 +...an * xn = b (mod 7)
这样一共可以列出m 个方程式,然后使用高斯消元来解此方程组即可。
 
 
代码:
 #include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <math.h>
using namespace std; const int MAXN = 4e2;
const int mod = ;
bool free_x[MAXN];
int a[MAXN][MAXN];
int x[MAXN]; inline int gcd(int a, int b){
int t;
while(b != ){
t = b;
b = a % b;
a = t;
}
return a;
} inline int lcm(int a, int b){
return a / gcd(a, b) * b;
} //返回-1表示无解,0表示有唯一解,大于0表示无穷解并返回变元个数
int Gauss(int equ, int var){//equ为方程数,var为未知数个数
int i, j, k;
int max_r;//当前列绝对值最大的行
int col;//当前处理的列
int ta, tb;
int LCM;
int temp;
int free_x_num;
int free_index;
for(int i = ; i <= var; i++){
x[i] = ;
free_x[i] = true;//初始化全部为变元
}
for(k = , col = ; k < equ && col < var; k++, col++){
//枚举当前处理的行k
//找到当前col列元素绝对值最大的行与第k行交换
max_r = k;
for(i = k + ; i < equ; i++){
if(abs(a[i][col] > abs(a[max_r][col]))) max_r = i;//记录当前列中最大值所在行
}
if(max_r != k){//与第k行交换
for(int j = k; j < var + ; j++){
swap(a[k][j], a[max_r][j]);
}
}
if(a[k][col] == ){//说明col列中第k行以下全是0了,则处理当前下一行
k--;
continue;
}
for(i = k + ; i < equ; i++){//枚举要删去的行
if(a[i][col] != ){
LCM = lcm(abs(a[i][col]), abs(a[k][col]));
ta = LCM / abs(a[i][col]);
tb = LCM / abs(a[k][col]);
if(a[i][col] * a[k][col] < ) tb = -tb;
for(j = col; j < var + ; j++){
a[i][j] = ((a[i][j] * ta - a[k][j] * tb) % mod + mod) % mod;
}
}
}
}
//无解的情况,化简的增广矩阵中存在(0,0,...1)这样的行(a!=0)
for(i = k; i < equ; i++){
if(a[i][col] != ) return -;
}
//无穷解的情况: 在var * (var + 1)的增广阵中出现(0, 0, ..., 0)这样的行,即说明没有形成严格的上三角阵.
//且出现的行数即为自由变元的个数.
if(k < var){
for(i = k - ; i >= ; i--){
// 第i行一定不会是(0, 0, ..., 0)的情况,因为这样的行是在第k行到第equ行.
// 同样,第i行一定不会是(0, 0, ..., a), a != 0的情况,这样的无解的.
free_x_num = ;//用于判断该行中的不确定的变元的个数,如果超过1个,则无法求解,它们仍然为不确定的变元.
for(j = ; j < var; j++){
if(a[i][j] && free_x[j]) free_x_num++, free_index = j;
}
if(free_x_num > ) continue;//无法求解出确定的变元
// 说明就只有一个不确定的变元free_index,那么可以求解出该变元,且该变元是确定的
temp = a[i][var];
for(j = ; j < var; j++){
if(a[i][j] != && j != free_index) temp -= a[i][j] * x[j] % mod;
temp = (temp % mod + mod) % mod;
}
x[free_index] = (temp / a[i][free_index]) % mod;//求出该变元
free_x[free_index] = ;//该变元已经确定,取消对应变元标记
}
return var - k;//自由变元有var-k个
}
//唯一解的情况: 在var * (var + 1)的增广阵中形成严格的上三角阵.
//计算出Xn-1, Xn-2 ... X0.
for(i = var - ; i >= ; i--){
temp = a[i][var];
for(j = i + ; j < var; j++){
if(a[i][j] != ) temp -= a[i][j] * x[j];
temp = (temp % mod + mod) % mod;
}
while(temp % a[i][i] != ) temp += mod;
x[i] = (temp /a[i][i]) % mod;
}
return ;
} int tran(char *s){
if(strcmp(s, "MON") == ) return ;
if(strcmp(s, "TUE") == ) return ;
if(strcmp(s, "WED") == ) return ;
if(strcmp(s, "THU") == ) return ;
if(strcmp(s, "FRI") == ) return ;
if(strcmp(s, "SAT") == ) return ;
return ;
} char s1[], s2[]; int main(void){
int n, m, k, t;
while(~scanf("%d%d", &n, &m)){
if(n + m == ) break;
memset(a, , sizeof(a));
for(int i = ; i < m; i++){
scanf("%d%s%s", &k, s1, s2);
a[i][n] = ((tran(s2) - tran(s1) + ) % mod + mod) % mod;//方程组的常数项
while(k--){
scanf("%d", &t);
t--;
a[i][t]++;
if(a[i][t] >= mod) a[i][t] %= mod;
}
}
int cnt = Gauss(m, n);//m为条件数目即方程数
if(cnt == ){
for(int i = ; i < n; i++){
if(x[i] <= ) x[i] += ;//题意要求每件物品最少生产3天,最多生产9天
printf("%d ", x[i]);
}
puts("");
}else if(cnt == -) puts("Inconsistent data.");
else puts("Multiple solutions.");
}
return ;
}

poj2947(高斯消元解同模方程组)的更多相关文章

  1. 【poj2947】高斯消元求解同模方程组【没有AC,存代码】

    题意: p start enda1,a2......ap (1<=ai<=n)第一行表示从星期start 到星期end 一共生产了p 件装饰物(工作的天数为end-start+1+7*x, ...

  2. POJ2947Widget Factory(高斯消元解同模方程)

    http://poj.org/problem?id=2947 题目大意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下:p start enda1,a2......ap (1<=ai&l ...

  3. Poj 2947 widget factory (高斯消元解同模方程)

    题目连接: http://poj.org/problem?id=2947 题目大意: 有n种类型的零件,m个工人,每个零件的加工时间是[3,9],每个工人在一个特定的时间段内可以生产k个零件(可以相同 ...

  4. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  5. [置顶] hdu 4418 高斯消元解方程求期望

    题意:  一个人在一条线段来回走(遇到线段端点就转变方向),现在他从起点出发,并有一个初始方向, 每次都可以走1, 2, 3 ..... m步,都有对应着一个概率.问你他走到终点的概率 思路: 方向问 ...

  6. 【BZOJ】2466: [中山市选2009]树 高斯消元解异或方程组

    [题意]给定一棵树的灯,按一次x改变与x距离<=1的点的状态,求全0到全1的最少次数.n<=100. [算法]高斯消元解异或方程组 [题解]设f[i]=0/1表示是否按第i个点的按钮,根据 ...

  7. 【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫

    [题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出 ...

  8. 【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树

    [题目大意] 给出一棵树,初始状态均为0,每反转一个节点的状态,相邻的节点(父亲或儿子)也会反转,问要使状态均为1,至少操作几次? [思路] 一场大暴雨即将来临,白昼恍如黑夜!happy! 和POJ1 ...

  9. poj1830(高斯消元解mod2方程组)

    题目链接:http://poj.org/problem?id=1830 题意:中文题诶- 思路:高斯消元解 mod2 方程组 有 n 个变元,根据给出的条件列 n 个方程组,初始状态和终止状态不同的位 ...

随机推荐

  1. Druid 0.2.25版本hive jdbc 不支持 conn.getHoldability() 兼容处理问题

    背景: 用Druid做Oracle的连接池感觉还不错,近日新项目要用Hive,故而也想使用Duid来做Hive的连接池.试了试果真可以,也没报错.但是,过了一段时间,同样的代码却出问题了.离奇的是我同 ...

  2. mjpg-streamer移植

    本文的copyright归yuweixian4230@163.com 所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途. 作者:yuweix ...

  3. 数据库学习笔记(二)MySQL数据库进阶

    MySQL 进阶 关于连表 左右连表: join 上下连表: union #自动去重 (当两张表里的数据,有重复的才会自动去重) union all #不去重 #上下连表示例: select sid, ...

  4. 2016.5.30实现透明Panel及控件置顶的方法

    想放置一个透明Panel在某控件上端,实现效果是可透过此Panel看见下面控件,但鼠标点击却无任何反应. 1.新建置自定义Panel类 using System; using System.Colle ...

  5. apache + tomcat 负载均衡分布式集群配置

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  6. 记录一次从txt文件导入数据的python下的MySQL实现

    环境: python2.7 ComsenzXP自带MySQL 安装python-MySQL模块 数据格式:txt格式的账号信息. 数据一行一条数据. 难点:有的行只有账号,没有密码:有的为空行:有的行 ...

  7. python爬虫(4)--Cookie的使用

    Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么 ...

  8. taglib标签在web.xml文件中报错的解决办法

    报错的原因分析: 在jsp2.0中,且2.4版的DTD验证中,taglib描述符,正确写法是放到<jsp-config></jsp-config>描述符中.所以,我们的tagl ...

  9. jquery datatable设置垂直滚动后,表头(th)错位问题

    jquery datatable设置垂直滚动后,表头(th)错位问题 问题描述: 我在datatable里设置:"scrollY": '300px',垂直滚动属性后,表头的宽度就会 ...

  10. IFC数据模型在三维引擎中模拟