魈凯KBS • 5个月前
第一种反归正距
using namespace std;
int n, m;
struct fucker {
int data[510];
inline bool operator < (const fucker &x) const {
for(int i=1; i<=m; i++) {
if(data[i] == x.data[i])
continue;
return data[i] < x.data[i];
}
return false;
}
} a[510];
int main() {
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++)
scanf("%d", &a[i].data[j]);
}
sort(a+1, a+1+n);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++)
printf("%d ", a[i].data[j]);
putchar('\n');
}
return 0;
}
评论:
相比之下,第三种更为复杂,but还是通
using namespace std;
int n, m;
struct fucker {
int data[510];
inline bool operator <= (const fucker &x) const {
for(int i=1; i<=m; i++) {
if(data[i] == x.data[i])
continue;
return data[i] < x.data[i];
}
return true;
}
} a[510], b[510];
void guibing(int start,int end) {
if(start >= end)
return;
int mid = (start+end)/2;
guibing(start,mid);
guibing(mid+1,end);
int left_index = start;
int right_index = mid+1;
int t = start;
while(left_index<=mid && right_index<=end) {
if(a[left_index] <= a[right_index]) {
b[t] = a[left_index];
left_index++;
} else {
b[t] = a[right_index];
right_index++;
}
t++;
}
while(left_index <= mid) {
b[t] = a[left_index];
t++;
left_index++;
}
while(right_index <= end) {
b[t] = a[right_index];
t++;
right_index++;
}
for(int i=start; i<=end; i++)
a[i] = b[i];
return;
}
int main() {
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++)
scanf("%d", &a[i].data[j]);
}
guibing(1, n);
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++)
printf("%d ", a[i].data[j]);
putchar('\n');
}
return 0;
}
第二种是最简洁,快速の
using namespace std; const int N=2e5+10; int n,m; struct dp{
int a[510];
}k[510]; bool swp(dp x,dp y) {
for(int i=1;i<=m;i++)
{
if(x.a[i]<y.a[i])
{
return 1;
}
else if(x.a[i]>y.a[i])
{
return 0;
}
}
} int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>k[i].a[j];
}
}
sort(k+1,k+n+1,swp);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<k[i].a[j]<<" ";
}
cout<<endl;
}
return 0;
}