问题 A: 礼物
时间限制: 1.000 Sec 内存限制: 512 MB
提交 状态
题目描述
在一个n×n的网格图上,放置着m个礼物,每个礼物有一个价值vi(1≤i≤m),你可以选择一个礼物,然后选择:
(1)取走与它同列的所有礼物,或者(2)取走与它同行的所有礼物
请问所能获取的礼物的最大价值之和是多少?
输入
第一行两个正整数n,m。
之后m行,每行三个整数xi,yi,vi,表示第i个礼物在第xi行,第yi列的格子上(不同礼物可能会在同一个格子),其价值为vi。
输出
一个整数,表示能获取的最大的礼物价值之和。
样例输入 Copy
6 7 1 3 1 2 2 2 2 4 4 3 3 6 3 6 3 5 2 5 5 4 6
样例输出 Copy
11
提示
样例1解释
选择第5行的任意一个礼物,然后将第5行取完。
【数据范围】
对于40%的数据,1≤n,m≤100
对于70%的数据,1≤n,m≤1000,0<vi≤10000
对于100%的数据,1≤n≤1000,1≤m≤105,1≤xi,yi≤n,vi≤106
这个题我就直接行列算了 然后比大小 应该有更简单的方法
但还是错了一次因为数据的范围问题。
#include<bits/stdc++.h>
using namespace std;
struct maap
{
int x;
int y;
int v;
};
int main()
{
int n,m;
cin>>n>>m;
maap a[m];
long long x[n]={0},y[n]={0};
for(int i=0;i<m;i++)
{
cin>>a[i].x>>a[i].y>>a[i].v;
}
for(int i=0;i<m;i++)
{
x[a[i].x]+=a[i].v;
y[a[i].y]+=a[i].v;
}
sort(x,x+n);
sort(y,y+n);
long long maxx=max(x[n-1],y[n-1]);
cout<<maxx<<endl;
return 0 ;
}
问题 B: 数字游戏
时间限制: 1.000 Sec 内存限制: 512 MB