green tool : help-assignment
方格游戏(C++)求解法?
题目描述
小H最近在玩一种很新的网络游戏,规则如下:
给定一个n行32列的方格图,每一个格子里都写有一个数字0/1,每行的积分为将该行从左至右所连成的二进制数。
一次左移变换是指把某一行所有的数都左移一格,同时将那一行的第1个数移到该行的最后一格。
在不超过m次左移变换后,n行的积分和S最大能是多少。
通关密码为十进制下的 S,请你设计一个程序帮助小H通关。
输入格式
第一行包含两个正整数n和m,用一个空格分隔。
接下来n行,每行包含一个正整数
,表示初始积分在十进制下的数。
输出格式
一个正整数表示通关密码。
样例 #1
样例输入 #1
3 9
2365587456 2399141888 9437184
样例输出 #1
7535067152
样例说明
初始方格图为:
10001101000000000000000000000000
10001111000000000000000000000000
00000000100100000000000000000000
最优操作为:对第一行使用 4次左移变换,对第二行使用4次左移变换,对第三行使用1次左移变换。
操作后的方格图为:
11010000000000000000000000001000
11110000000000000000000000001000
00000001001000000000000000000000
其各行的积分值为:348966093、4026531848、18874368,答案为各行积分值之和,即7535067152。
数据规模与约定
对于30%的数据, 1<=n, m<=12
对于 60%的数据, 1<=n, m<=100
另有 10%的数据, 1<=n<=1000, m = 1
对于 100%的数据,1<=n, m<=1000,0<=Ai<=2^32-1