题目链接: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. 网络监控之一:ss(Socket Statistics)

    ss是Socket Statistics的缩写. 顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的 ...

  2. java中实现多线程的方法有几种以及如何实现多线程

    多线程是java语言区别于其它语言的一大特点.其它语言向C++的话如果要实现多线程的话,必须调用操作系统的多线程机制(我不确定自己记得对不对 了感兴趣的自己上网查查看). 在java5以前实现多线程有 ...

  3. git学习5 ecipse集成git(转载)

    原文地址:http://blog.csdn.net/hhhccckkk/article/details/10458159 有的eclipse已经自带了GIt了,就不用安装了 1: 进行安装Git,和安 ...

  4. 2014.10.1 Cmd更改系统时间

    Process p = new Process(); //Process类有一个StartInfo属性 //设定程序名 p.StartInfo.FileName = "cmd.exe&quo ...

  5. 10-19C#基础--第四部分类型(2)重点

    类型: 一.数字:Math类型 1)Math.Ceiling() ( 表示进位.));//只要小数点后有值,就向前进一位,取上限. string s = Console.ReadLine(); dou ...

  6. ping 127.0.0.1请求超时的解决办法?

    转自:http://blog.51cto.com/dengyong/1429699 打开网络连接,你很有可能启用了虚拟wifi.若有无线网卡就把无线网卡关掉,然后本地连接那里(就是有线网卡的那个连接) ...

  7. office 2010打开doc文档报错:Word 在尝试打开文件时遇到错误

    今天在百度文库中下载了几个文档,下载后发现无法打开.出现以下的提示框. 那么,使用多年office的我,这点小问题当然难不倒我啦. 这个问题是由于系统安全设置所导致的 ,所有我们只需要处理这个安全设置 ...

  8. SQL server 2008安装教程

    下载SQL server 2008 r2(网上资源很多,这里给出一个:安装) 解压后右键以管理员权限打开set-up 这里可能会出现问题:.net framework 3.5未安装,可以参考 快速安装 ...

  9. hibernate学习笔记(6)组件属性以及单表操作

    组件属性:实体类中的某个属性属于用户自定义类的对象: 作用:将两个实体类合并在一起组建成一个表 在hbm.xml文件中配置: 格式: <component name="取的名字&quo ...

  10. 使用HttpWebRequest POST 文件,带参数

    public string HttpUploadFile(string url, string file, string paramName, string contentType, NameValu ...