这个题貌似特别奇怪,根本什么算法都想不出来,然而。。。看完题解之后,竟然用了能量守恒?惊了!

这里有一个题解:

https://blog.csdn.net/Mima_Reincarnation/article/details/53965251

膜一下自己写出来的大佬,太强了!

题干:

题目描述
Magic Land上的时间又过了若干世纪……
现在,人们谈论着一个传说:从前,他们的祖先来到了一个位于东方的岛屿,那里简直就是另外一个世界。善于分析与构造的Magic Land上的人们总是不明白那里的人们是如何不借助精确的实验与计算驱动和操纵魔法。
偶然地,一个魔法使(Magician)来到了Magic Land,在临走的时候留下了一个神奇的盒子,叫做星器(Casket of star)。
虽然不知道这个盒子是做什么的,但是经过了大量的实验和计算后,人们已经清楚它的一些事实:
.星器之中有N×M个区域,可看作分成N行和M列的格子,每个区域之中有若干单位的称为“星”的对象,这个对象的最小单位已经被确定,所以,这个数量总是整数。
.魔法使可以驱动星器中位于同一行或同一列的不相邻(有公共边的区域称为相邻的)两个区域中各1单位的“星”,使得它们分别向中心移动1格。
.每一次使用2中的方法驱动“星”,将会产生魔力,魔法使会得到这一部分魔力。魔力的量等于这个两个区域之间所间隔的区域数。
这样,我们可以用一个N×M的数表来表示星器的状态,比如N=,M=3时: 当星器为左图的状态时,通过操纵第一行的第1和3个区域中的“星”(加粗的数字对应的区域),变为右图所示的状态,同时,将产生1单位的魔力(因为这两个区域之间恰好隔了1个区域)。
在经过了进一步的研究之后,人们知道了这个星器最初的状态(Ini)以及最终被他们得到时的状态(Fin)。
你希望知道,星器最多帮助它的拥有者提供了多少的魔力。即:经过一系列上述操作由初态(Ini)变为终态(Fin),至多产生多少魔力。
需要注意的是,显然操作过程中每个区域内“星”的数量不能是负的,即:如果那个区域已经没有“星”了,当然就不能继续操作了。
输入格式
第一行包含两个正整数N、M表示星器的大小。
接下来的N行,每行包含M个自然数:Iniij,描绘了初态(Ini)。
在一个空行后的N行,每行包含M个自然数:Finij,描绘了终态(Fin)。
输出格式
输出一个正整数,表示至多产生的魔力。
样例输入
【输入样例1】 【输入样例2】 样例输出
【输出样例1】 【样例1解释】
唯一的一种操作方法是:
对第5列的两个“星”进行一次操作,产生魔力2;
对第1列的两个“星”进行两次操作,产生魔力3+;
对第4行的两个“星”进行一次操作,产生魔力1;
一共产生7单位的魔力。
【输出样例2】 提示
【数据规模和约定】
%的数据中N ≤ ,如样例2;
%的数据中1 ≤ N,M ≤ ,Iniij,Finij ≤ 。
所有数据保证了至少存在一个操作方法使得星器由初态变为终态,同时保证了初态与终态不是完全相同的。

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(int i = a;i <= n;i++)
#define lv(i,a,n) for(int i = a;i >= n;i--)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
int mp[][];
int n,m;
ll tot = ;
int main()
{
read(n);read(m);
duke(i,,n)
{
duke(j,,m)
read(mp[i][j]);
}
int v;
duke(i,,n)
{
duke(j,,m)
{
read(v);
tot += (ll)(mp[i][j] - v) * (i * i + j * j);
}
}
printf("%lld",tot >> );
return ;
}
/*
5 5
1 0 0 0 1
0 0 0 0 0
0 0 0 0 0
0 1 0 1 1
1 0 0 0 0
0 0 0 0 0
0 0 0 0 1
2 0 0 0 1
0 0 2 0 0
0 0 0 0 0
*/

B2321 [BeiJing2011集训]星器 数学&&物理的更多相关文章

  1. BZOJ2321 [BeiJing2011集训] 星器

    2321: [BeiJing2011集训]星器 Time Limit: 1 Sec  Memory Limit: 128 MB Description Magic Land上的时间又过了若干世纪…… ...

  2. 【BZOJ】2321: [BeiJing2011集训]星器(数学+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2321 完全想不到.. 第一眼以为是爆搜,看到数据范围果断放弃:第二眼以为是网络流(因为只有行列操作, ...

  3. 【BZOJ 2321】 [BeiJing2011集训]星器

    Description Magic Land上的时间又过了若干世纪…… 现在,人们谈论着一个传说:从前,他们的祖先来到了一个位于东方的岛屿,那里简直就是另外一个世界.善于分析与构造的Magic Lan ...

  4. sqlserver 行转列 语文,数学,物理,化学

    数据库查询行转列 1.原数据库值 stdname stdsubject result 张三 语文 张三 数学 张三 物理 李四 语文 李四 数学 李四 物理 李四 化学 李四 化学 2.要得到如下表 ...

  5. BZOJ 2321 星器

    星器 思路: 势能分析法. 假设每颗星星的势能为\(x^2+y^2\) 那么对于一行的两颗星星\((i, j), (i, k), j < k\) 它转移到\((i, j+1), (i, k-1) ...

  6. BJ2011集训/BZOJ2321 星器

    对于一行上的两个星星,假设它们的坐标为\(x1,x2\) \(x1->x1+1\) \(x2->x2-1\) \((x1+1)^2=x1^2+1+2*x1\) \((x2-1)^2=x2^ ...

  7. hdu 4946 Just a Joke(数学+物理)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4969 Just a Joke Time Limit: 2000/1000 MS (Java/Others) ...

  8. BNUOJ34977夜空中最亮的星(数学,向量的应用)

    夜空中最亮的星 Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. CSS3利用box-shadow实现相框效果

    CSS3利用box-shadow实现相框效果 <style> html { overflow: hidden; background-color: #653845; background- ...

  2. C# 控件调整

    //最大化 this.WindowState = FormWindowState.Maximized; //去掉标题栏 this.FormBorderStyle = FormBorderStyle.N ...

  3. vue命令行创建运行工程

    // install vue-cli 安装依赖包 npm install --g vue-cli// 使用vue-cli初始化项目 vue init webpack my-project// inst ...

  4. cshtml中字符串中表示特殊字符@

    用“@@”表示字符串中的特殊字符@

  5. 跳转语句(break、continue)

    break语句 在switch条件语句和循环语句中都可以使用break语句.当它出现在switch条件语句中时,作用是终止某个case并跳出switch结构. 当它出现在循环语句中,作用是跳出循环语句 ...

  6. c++ map: 根据value逆向查找key

    #include <iostream> #include <map> #include <algorithm> #include <vector> #i ...

  7. 学生成绩管理系统C(链表)语言

    #include"stdio.h" #include"stdlib.h" #include"string.h" //用于调用一些函数 str ...

  8. 第十二节:pandas缺失数据处理

    1.isnull():检查是否含有确实数据 2.fillna():填充缺失数据 3.dropna() :删除缺失值 4.replace():替换值

  9. Linxu基础入门

    Linux命令大全:http://man.linuxde.net/ 创建目录 使用 mkdir 命令创建目录 mkdir $HOME/testFolder 切换目录 使用 cd 命令切换目录 cd $ ...

  10. linux获得网卡信息

    #define MAX_INTERFACE 64 int showifs() { int i; int rc; int sock; int ifnum; struct ifreq ifr[MAX_IN ...