标签:line name 应该 class namespace 思路 == ace space
排一下序然后枚举计数就行了,不是挺简单的嘛。
这是我以为能过的代码,没想到\(Wrong\ answer\ on\ test\ 3\),还是只能过样例。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N];
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
int n;
ll m;
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
ll sum = 0;
for(int i = 1; i <= n; i++) {
if(sum + n < m) {
sum += n;
continue;
}
for(int j = 1; j <= n; j++) {
sum++;
if(sum == m) {
cout << a[i] << " " << a[j] << "\n";
return 0;
}
}
}
return 0;
}
我们举个简单的例子\(1\ 1\ 2\),如果按照上面的枚举顺序应该是
\([1,1][1,1][1,2][1,1][1,1][1,2][1,2][1,2][2,3]\)
但是真实却是
\([1,1][1,1][1,1][1,1][1,2][1,2][1,2][1,2][2,2]\)
相比应该看出哪里不一样了吧,数组中1连续出现,我们枚举的数对也会连续出现。所以我们改进的办法就是加一个map来计数,这样就可以按照题目要求的顺序得到递增的序列了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
int a[N], n, b[N], m;
ll k;
map<int, int> mp;
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false);
cin >> n >> k;
m = n;
for(int i = 1; i <= n; i++) {
cin >> a[i];
b[i] = a[i];
mp[a[i]]++;
}
sort(a + 1, a + 1 + n);
sort(b + 1, b + 1 + m);
m = unique(b + 1, b + m + 1) - (b + 1);
ll sum = 0;
for(int i = 1; i <= m; i++) {
if(sum + (ll)n * mp[b[i]] < k) {
sum += (ll)n * mp[b[i]];
continue;
}
for(int j = 1; j <= n; j++) {
if(k > sum && k <= sum + mp[b[i]]) {
cout << b[i] << " " << a[j] << "\n";
return 0;
}
sum += mp[b[i]];
}
}
return 0;
}
标签:line name 应该 class namespace 思路 == ace space
原文地址:https://www.cnblogs.com/lifehappiness/p/12826051.html