Wannafly挑战赛26-B 冥土追魂(贪心?思维?模拟?)

转载出自 https://blog.csdn.net/c_13579/article/details/83039005

贪心不行,数学思维寻找它的选取规律

#include<iostream> 
#include<cstdio> 
#include<algorithm> 
#include<cstring> 
#include<queue>
#include<cmath> 
#define maxn 1005 
#define INF 0x3f3f3f3f
#define LL long long 
#define PI 3.1415926 
#define e 2.7182818 
using namespace std; 
int n,m,k;
LL a[maxn][maxn];
LL qz[maxn][maxn];
bool cmp(int a,int b)
{
	return a>b;
}
struct node
{
	LL sum;
	int id;
	friend bool operator <(node a,node b)
	{
		return a.sum<b.sum;
	}
}s[maxn];
int main() 
{
	//ios::sync_with_stdio(false);
 	cin>>n>>m>>k;
 	LL ans,now;
	ans=0;
 	for(int i=1;i<=n;i++)
 	{
 		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
		sort(a[i]+1,a[i]+m+1,cmp);
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			qz[i][j]=qz[i][j-1]+a[i][j];
		}	
		ans+=qz[i][m];
		s[i].sum=qz[i][m];
		s[i].id=i;
	}
	sort(s+1,s+1+n);

	int cnt=0;

	for(int i=1;i<=n;i++)
	{
		cnt=0;
		now=qz[i][k%m];
		for(int j=1;j<=n;j++)
		{
			if(cnt==k/m)
				break;	
			if(s[j].id==i&&k%m)
				continue;
			now+=s[j].sum;
			cnt++;
		}
		ans=min(ans,now);
	}
	cout << ans << endl;
	return 0; 
}  

猜你喜欢

转载自blog.csdn.net/wwwlps/article/details/83109563