0分求调(思路非题解思路)
  • 板块P1392 取数
  • 楼主SCP3023
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/8 10:22
  • 上次更新2024/8/8 11:10:23
查看原帖
0分求调(思路非题解思路)
1128129
SCP3023楼主2024/8/8 10:22

想法是先每一行都排个序 之后建立2维数组存储每一位和本行第一位的差值 先输出第0列之和(最小情况) 之后不断在存储差值的那个数组的第一列擂台比较出最小者,输出这一位加第0列之和(相当于在第零列把这一列的第一个数和这一位交换,由于他们的差值最小,所以就诞生了下一个最优解,之后交换这一位和他后面的第a位(a代表这一行的数字被作为最优解出现的次数) 个人感觉思路没问题,过了样例,但是所有数据据点都豹0

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
bool cmp(int a,int b){
 return a<b;
}
int a[N][N]={},qz[N][N],ptr[N];
int main(){
 	int n,m,k;
 	cin>>n>>m>>k;
 	for(int i=0;i<n;i++){
  		for(int j=0;j<m;j++){
   			cin>>a[i][j];
 		}
 	}
    for(int i=0;i<n;i++){
  		sort(a[i],a[i]+m,cmp);
 	}
 	for(int i=0;i<n;i++){
  		for(int j=0;j<m;j++){
   			qz[i][j]=a[i][j]-a[i][0];
  		}
 	}
 	/*for(int i=0;i<n;i++){
  		for(int j=0;j<n;j++){
   			cout<<qz[i][j]<<" ";
  		}
  		cout<<'\n';
 	}*/
 	int cnt=0;
 	for(int i=0;i<m;i++){
  		cnt+=a[i][0];
 	}
 	for(int i=0;i<m;i++){
	 	ptr[i]=2;
	 }
	 cout<<cnt<<' ';
 	int mn=2147483647,wei=0,las=-2147483647;
 	int tme=0;
 	while(tme<k-1){
 		mn=2147483647;
	 	for(int i=0;i<m;i++){
	 		if(qz[i][1]==las){
			 	swap(qz[wei][1],qz[wei][ptr[wei]]);	
			 	if(qz[i][1]<mn){
			 	    mn=qz[i][1];
			 	    wei=i;
			    }
				continue;
			}
		 	if(qz[i][1]<mn){
			 	mn=qz[i][1];
			 	wei=i;
			}
		}
		cout<<cnt+qz[wei][1]<<' ';
		las=qz[wei][1];
		swap(qz[wei][1],qz[wei][ptr[wei]]);
		ptr[wei]++;
		tme++;
	 }
 	//cout<<cnt;
 return 0;
}
2024/8/8 10:22
加载中...