[ L i n k \frak{Link} Link]


赛时代码(WA)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<cstring>
#include<queue>
#include<set>
using namespace std;
#define ll long long
#define getchar() (frS==frT&&(frT=(frS=frBB)+fread(frBB,1,1<<12,stdin),frS==frT)?EOF:*frS++)
char frBB[1<<12]={},*frS=frBB,*frT=frBB;
inline ll read()
{ll x=0;char ch=0;bool w=0;while(!isdigit(ch))w|=(ch=='-'),ch=getchar();while(isdigit(ch))x=x*10+(ch-'0'),ch=getchar();return w?-x:x;
}
int N,M,K;
ll Ans=0;
ll vis[1005]={};
pair<pair<ll,ll>,int> AAn[1005]={};
pair<int,int> id[1005]={};
ll Aij[1005][1005]={};
bool cmp(ll a,ll b)
{return a>b;
}
pair<ll,ll> Lst[1005][1005]={};
int main()
{N=(int)read(),M=(int)read(),K=(int)read();for(int i=1;i<=N;++i){for(int j=1;j<=M;++j){Aij[i][j]=read();}sort(Aij[i]+1,Aij[i]+1+M,cmp);for(int j=1;j<=min(M,K);++j)Lst[j][i].first=Lst[j-1][i].first+Aij[i][j],Lst[j][i].second=i;if(K>=M)AAn[i].first.first=Lst[M][i].first;AAn[i].first.second=Lst[K%M][i].first;AAn[i].second=i;}
//    for(int i=1;i<=N;++i){//    for(int j=1;j<=min(M,K);++j)printf("%d ",Lst[j][i].first);
//    printf("\n");
//    }sort(AAn+1,AAn+1+N);for(int i=1;i<=min(M,K);++i)sort(Lst[i]+1,Lst[i]+1+N);while(K){if(K>=M){int i=1;while(vis[AAn[i].second])++i;Ans+=AAn[i].first.first;vis[AAn[i].second]=1;}else{int i=1;while(vis[Lst[K][i].second])++i;Ans+=Lst[K][i].first;vis[Lst[K][i].second]=1;}
//        cout<<K<<" "<<Ans<<endl;K-=min(K,M);}printf("%lld",Ans);return 0;
}

为我的智商干一个凉凉杯(?
Alice想要让Bob拿到最小的,Bob想要拿到最大的
那么Alice每次会取一个“最大值最小”的行,Bob当然会取里面的最大值…
这是十分贪心的情况,因为可能会这样:
2 4 5
2 3 3 3 3
1 5 1 5 1
那就不行了。
如果只看行最大值的话,后面那些就顾及不到,也就有可能出现局部最优的情况。
进一步考虑。
为什么要放弃最大值最小的行?
考虑到从某一行里面取的值一定是单调递减的,可以把每一行排序。
放弃了行x,选择了行y≠x。
有 M a x { x } &lt; M a x { y } Max\{x\}&lt;Max\{y\} Max{x}<Max{y},而且在某一个位置有 S u m { x } &gt; S u m { y } Sum\{x\}&gt;Sum\{y\} Sum{x}>Sum{y}
当然在这一个位置行 y y y的 S u m Sum Sum应该是没被选的那些行里面最小的。
那么这是哪一个位置?
如果可以取但是不取完,那么就是说其它行前面的部分比y行的最后那一部分要小。
取z行作其它行的代表。
我们把这两行按照取到的位置这么分:
(z行)ab
(y行)cd
(abcd各代表一部分值的和)
已经知道a>c,a>b,c>d
不取d那么a<d
然而a>c>d。Q.E.D
所以一定会取完K/M行。至于怎么取很简单,按照sum从小到大排个序。
可是K%M可能≠0。
剩下的K%M行呢?从剩下没被取的里面拿吗?
这个地方我打比赛的时候没想好,就真这么以为了(贪心贪傻了
假设选了行v的前K%M个
如果行v被选的话,那行v这一行就不能全取,要在后面另外全取一行u。
同样假设
(v行)op
(u行)qr
有p<o,o<q,q>r,q+r<o+p
o+q+r<o+p+q是否可能成立?
没有办法知道是否r<p。所以可能成立。
至于u是哪一行那很简单,当然是sum排序之后的第K/M+1行了。
(wannafly自闭赛

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
#define ll long long
int N,M,K;
ll Ans=0;
pair<ll,ll> AAn[1005]={};
ll Aij[1005]={};
bool cmp(ll a,ll b){return a>b;}
ll Lst[1005]={};
int main()
{scanf("%d%d%d",&N,&M,&K);for(int i=1;i<=N;++i){for(int j=1;j<=M;++j)scanf("%lld",&Aij[j]);sort(Aij+1,Aij+1+M,cmp);for(int j=1;j<=M;++j)Lst[j]=Lst[j-1]+Aij[j];AAn[i].first=Lst[min(K,M)];AAn[i].second=Lst[K%M];}sort(AAn+1,AAn+1+N); int cnt=K/M; if(!cnt){ printf("%lld",AAn[1].first); return 0;}for(int i=1;i<=cnt;++i)Ans+=AAn[i].first;ll tmp=Ans; if(K%M){Ans=2147483647147483647ll;for(int i=cnt+1;i<=N;++i)Ans=min(Ans,tmp+AAn[i].second);for(int i=1;i<=cnt;++i)Ans=min(Ans,tmp-AAn[i].first+AAn[i].second+AAn[cnt+1].first);}printf("%lld",Ans);return 0;
}

[Nowcoder] [Wannafly26B] 冥土追魂 [贪心]相关推荐

  1. Wannafly挑战赛26 B.冥土追魂 贪心

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misa ...

  2. nowcoder (牛客)Wannafly挑战赛26 B: 冥土追魂 (思维)

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...

  3. [贪心] 冥土追魂 Wannafly挑战赛26

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 冥土追魂 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  4. Wannafly挑战赛26:B冥土追魂(模拟?贪心?暴力?)

    题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka和Kuroko在一个 n x m 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 k 回合,每一 ...

  5. Wannafly挑战赛26-B 冥土追魂

    地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...

  6. Wannafly挑战赛26: B. 冥土追魂(思维题)

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misa ...

  7. Wannafly挑战赛26 B 冥土追魂(暴力)

    题意:链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka ...

  8. Wannafly挑战赛26 B冥土追魂

    链接:https://www.nowcoder.com/acm/contest/212/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他语言104 ...

  9. 【2018.10.12】冥土追魂

    原题 题目描述 有一天 Misaka 和 Kuroko 在玩一个关于冥土追魂的游戏.... Misaka和Kuroko在一个 $n * m$ 的棋盘上玩游戏,每个格子上都放着一些呱太.游戏共进行 $k ...

最新文章

  1. 【统计学习方法】K近邻对鸢尾花(iris)数据集进行多分类
  2. 编译phonetisaurus时configure找不到openfst的问题解决
  3. 《Effective Java》 读书笔记(持续更新)
  4. Visual Assist插件使用的一些相关文章
  5. 近两天让我羞愧难当的遭遇
  6. python播放音乐-python 模拟(简易)音乐播放器
  7. openssl生成Windows证书
  8. 【图像加噪】基于matlab多种噪声图像加噪(含信息熵)【含Matlab源码 1837期】
  9. Oracle大神资料索引
  10. 百钱买百鸡问题的最优解法
  11. 《东周列国志》第十四回 卫侯朔抗王入国 齐襄公出猎遇鬼
  12. 天涯上拣来的爱情哲学
  13. IO_CELL里的slew rate control
  14. localhost可以访问,使用ip地址失败
  15. 量子计算机研制成功图片,光量子计算机的曙光:科学家成功研制出量子光源
  16. 解决eclipse: Resource is out of sync with the file system 报错问题
  17. vue3+ant design vue+ts实战【ant-design-vue组件库引入】
  18. 超详细!Codis 入门与实践
  19. 关于酷柚易汛进销存开源版订货通操作说明
  20. 基于GNS3的某省农科院网络组网规划方案设计

热门文章

  1. OpenCV学习之滚动条播放视频
  2. 怎么赚钱比较快?想赚钱就要学会这些!
  3. java 正则表达式替换多个全角空格为一个半角空格_去掉字符串两端的全角空格和半角空格(含源代码)...
  4. 【CSS】滑动门技术 ( 借助 CSS 精灵技术实现 | 外部标签设置左半部分背景图片 | 内部标签设置右半部分背景图片 | 鼠标经过更换背景 | 代码示例 )
  5. 《共模电感元器件》的特性分析
  6. sudo comand
  7. java 鱼刺图_鱼骨图问题分析法
  8. office-Excel-表格中相同项进行求平均
  9. 类脑计算机研制,我国科学家开发出新型类脑芯片
  10. JavaScript - 构造方法和this关键字使用