题目链接

题意

给出一个11元组A和11元组B,给出n个11元方程,每个方程有一个日期,要让A变成B,问最少需要日期多少才可以变。

思路

因为日期满足单调性,所以可以二分答案。判断的时候就是高斯消元套模板,这个模板是要能对11取模的(因为说了数字在0到10之间)。

#include <bits/stdc++.h>
using namespace std;
const int MOD = 11;
const int MAXN = 1011;
struct Node {
int num[11];
int tid; bool operator < (const Node &rhs) const {
return tid < rhs.tid;
}
} init[MAXN];
int a[12][MAXN];//增广矩阵
int x[MAXN];//最后得到的解集
int s[11], e[11]; inline int gcd(int a,int b) {
while(b != 0) {
int t = b;
b = a%b;
a = t;
}
return a;
} inline int lcm(int a,int b) {
return a/gcd(a,b)*b;
} long long inv(long long a,long long m) {
if(a == 1)return 1;
return inv(m%a,m)*(m-m/a)%m;
} int Gauss(int equ, int var) {
int max_r,col,k;
for(k = 0, col = 0; k < equ && col < var; k++,col++) {
max_r = k;
for(int i = k+1; i < equ; i++)
if(abs(a[i][col]) > abs(a[max_r][col]))
max_r = i;
if(a[max_r][col] == 0) {
k--;
continue;
}
if(max_r != k)
for(int j = col; j < var+1; j++)
swap(a[k][j],a[max_r][j]);
for(int i = k+1; i < equ; i++) {
if(a[i][col] != 0) {
int LCM = lcm(abs(a[i][col]),abs(a[k][col]));
int ta = LCM/abs(a[i][col]);
int tb = LCM/abs(a[k][col]);
if(a[i][col]*a[k][col] < 0)tb = -tb;
for(int j = col; j < var+1; j++)
a[i][j] = ((a[i][j]*ta - a[k][j]*tb)%MOD + MOD)%MOD;
}
}
}
for(int i = k; i < equ; i++)
if(a[i][col] != 0)
return 0;//无解
return 1;
} int check(int m) {
int equ = 11, var = m + 1; // 行数和列数
for(int i = 0; i < 11; i++)
for(int j = 0; j <= m; j++)
a[i][j] = init[j].num[i];
for(int i = 0; i < 11; i++)
a[i][var] = (e[i] - s[i] + MOD) % MOD;
return Gauss(equ, var);
} int main() {
int t; scanf("%d", &t);
while(t--) {
int n; scanf("%d", &n);
for(int i = 0; i < 11; i++) scanf("%d", &s[i]);
for(int i = 0; i < 11; i++) scanf("%d", &e[i]);
for(int i = 0; i < n; i++) {
for(int j = 0; j < 11; j++) scanf("%d", &init[i].num[j]);
scanf("%d", &init[i].tid);
}
sort(init, init + n);
int l = 0, r = n - 1, ans = -1;
while(l <= r) {
int m = (l + r) >> 1;
if(check(m)) {
ans = init[m].tid;
r = m - 1;
} else {
l = m + 1;
}
}
if(~ans) printf("%d\n", ans);
else puts("unreachable");
} return 0;
}

最新文章

  1. 阿里云部署多个tomcat
  2. python-day-20
  3. jquery_插件
  4. Spark Streaming源码解读之JobScheduler内幕实现和深度思考
  5. ip数据结构
  6. centos系统常用软件环境搭建
  7. highcharts 多数据+切换
  8. sql server 获取每一个类别中值最大的一条数据
  9. JAVA设计模式-工厂模式(代码示例)
  10. 论山寨手机与Android联姻 【2】手机OS成为核心
  11. dynamics 365 AI 解决方案 —— 微软布局
  12. @EnableWebMVC注解理解
  13. 替换空格[by Python]
  14. SkylineGlobe 7.0.1 &amp; 7.0.2版本Web开发 如何实现土方量计算
  15. NewZealand。。。
  16. scala下划线
  17. 前端工程化系列[05] Yeoman脚手架使用入门
  18. windows上java中文乱码-指定字符集 -Dfile.encoding=UTF-8
  19. csv 文件读取(input)和截分(split)方法
  20. Nginx 日志 worker_connections are not enough while connecting to upstream

热门文章

  1. 解决引用 System.Windows.Interactivity程序集生成多国语言文件夹fr、es、ja等问题
  2. Java之nio MappedByteBuffer的资源释放问题
  3. ELINK编程器典型场景之多APP文件下载
  4. dataGrid 源更新 事件
  5. Win8 Metro(C#)数字图像处理--2.66FloodFill算法
  6. Python爬虫: &quot;追新番&quot;网站资源链接爬取
  7. python脚本,重新设置图片大小
  8. 微信小程序把玩(十六)form组件
  9. string与QString转换(string既可以是utf8,也可以是gbk)
  10. SQLite实现内存键值存储