HELP!有人会做9171最小值吗

题目描述:

给出一个n个数的数列
a
1
,
a
2
,
.
.
.
,
a
n
a
1

,a
2

,…,a
n

,有Q个询问。每次问你区间
a
l
,
a
l
+
1
,
a
l
+
2
,
.
.
.
,
a
r
a
l

,a
l+1

,a
l+2

,…,a
r

中的最小值是多少?

输入格式:

第一行两个整数n和Q。

第二行n个整数。

接下来Q行每行2个整数l和r。

输出格式:

共Q行,每行一个整数。

样例输入:

3 2
1 2 3
2 3
1 3
样例输出:

2
1
约定:

所有数不超过1000。

int main() {
int n, Q;
cin >> n >> Q;

int arr[n];
for (int i = 0; i < n; i++) {
    cin >> arr[i];
}

for (int i = 0; i < Q; i++) {
    int l, r;
    cin >> l >> r;

    // 使用 multiset 来存储区间内的元素
    multiset<int> s;
    for (int j = l - 1; j < r; j++) {
        s.insert(arr[j]);
    }

    // 输出区间内的最小值
    cout << *s.begin() << endl;
}

这是重点部分其他自己想

2 个赞

还要加头文件和return 0;

1 个赞

我至今还没看懂第二行的N个数有什么用(尴尬 :sweat:

1 个赞

哥你除了头文件和return 0其他你都打了还有其他部分要想的吗

他的做法是O(NQ log NQ)的,公式不太记得你凑合看一下用了高深奥妙的STL但是我们可以用简单粗暴的暴力解决它(O(NQ))少了一个logNQ代码如下

#include <bits/stdc++.h>

using namespace std;

const int N = 1005;

int a[N], n, q;

int main() {
	cin >> n >> q;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	} 
	for (int l, r; q--;) {
		cin >> l >> r;
		int ans = 1e9;
		for (int i = l; i <= r; i++) {
		    ans = min(ans, a[i]); //求最小值	
		}
		cout << ans << "\n";
	}
	return 0;
}

然后我们突然发现求静态区间内的最小值可以用ST表直接做到O(N log N + Q)的时间复杂度代码如下(但是没有多大的必要)

#include <bits/stdc++.h>

using namespace std;

const int N = 1005, M = 15;

int a[N], f[N][M], lg[N], n, q; //f[i][j]表示从i到i + (1 << j) - 1这1 << j个位置中的最小值 lg[i]表示i的对数 

void ST() {
	for (int j = 1; j <= 10; j++) {
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			f[i][j] = min(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);  
		}
	}
}

int main() {
	cin >> n >> q;
	lg[0] = -1;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		lg[i] = lg[i / 2] + 1;//求对数 
		f[i][0] = a[i];       //i到i的最小值是a[i] 
	} 
	ST();
	for (int l, r; q--;) {
		cin >> l >> r;
		int o = lg[r - l + 1]; 
		cout << min(f[l][o], f[r - (1 << o) + 1][o]) << "\n";
	}
	return 0;
}

n这么点大有必要吗,提高的来这炸鱼是吧(无恶意

1 个赞


注意看后面的那句话当然没必要纯属闲着没事干(不然也不回来水论坛只是说一下这种做法

1 个赞