好久没更新了 最近做的一些题,陆续写上来一些吧 ,,,
题意: 给出你一个n和n个数,问你是否存在 x * y的一个矩阵,可以满足n个数依次走的路径。
比如样例1
8 1 2 3 6 9 8 5 2
然后下面这个图的解释 , 就是可以在 3 * 3的矩阵里保存这个序列 ,所以YES 3 3,不存在这个矩阵的话 就 NO
思路:
稍微想一下,其实根本不用管x这个行有多少的,只要满足 ,我们就直接输出最大值,真正影响的是后面的这个y,y列的情况,刚开始想的是如果两个数之间的差,除了1,除了另外一个数,还存在一个与他们俩个不同的数的话,肯定就NO了,
但是即使他满足前面那个条件也不一定是yes ,
比如
4
2 3 4 2 只有1 和 2 ,但是他是不存在2 可以走到 3 的,这就是问题所在。
其实在一行里,只有第一个数,和最后一个数是特殊的, 在这儿设第一个数l,最后一个数r
比如第一个数,如果y!=1的时候, 第一个数肯定不可能从l - 1得来的,最后一个数也不可能是由r - 1得来的,因此你需要特判这两种情况就可以了。
刚开始没想到,暴力判断的,后来wa在18组,一看那组数据,突然就想到了,
代码如下:
#include <bits/stdc++.h>using namespace std;int n,a[200200];
int main() {ios::sync_with_stdio(false);while(cin >> n) {int flag = 0;for(int i = 0; i < n; i++)cin >> a[i];int y = -1;for(int i = 0; i < n - 1; i++) {int x = abs(a[i + 1] - a[i]);if(x == 1)continue;else if(x == 0) {cout << "NO" << endl;return 0;} else {y = x;}}if(y == -1)cout << "YES" << endl,cout << 1000000000 << " " << 1 << endl;else {for(int i = 1; i < n; i++) {int ll = abs(a[i] - a[i - 1]); if(y != ll && ll != 1) {cout << "NO" << endl;flag = 1;break;}if(a[i] % y == 0 && a[i - 1] - a[i] == 1) {cout << "NO" << endl;flag = 1;break;}if(a[i] % y == 1 && a[i] - a[i - 1] == 1) {cout << "NO" << endl;flag = 1;break;}}if(!flag)cout << "YES" << endl,cout << 1000000000 << " " << y << endl;}}return 0;
}