列表

详情


NC200383. 扑克游戏V4

描述

社会人士xp深谙洗牌之道。据悉,xp最多的时候一次性洗了2000副牌!这一壮举甚至被记录进了长尼斯世界纪录

可惜,洞察一切的你发现了xp洗牌的本质:每次娴熟的手法表演背后,做的只是一次切牌的动作而已——将牌堆前a张牌放到第b张牌的后面。为了表演效果,xp会重复这个花式切牌动作k次。

现在,m位学妹围着xp,在玩一种船新版本的扑克游戏。首先,由xp洗牌、发牌。发牌时,xp会将牌按顺序一张一张地发给学妹们。之后,学妹们计算他们手上牌的点数总和并喊出来,最大的获胜。这是一种很特殊的扑克牌,一副牌共有n张,牌面的点数范围是1~1000000000。

为了揭发xp出老千的事实,你需要在xp发完牌的瞬间,喊出赢家的点数总和。

输入描述

有多组输入。

每组输入两行。

第一行输入五个整数,含义见题目描述

第二行输入n个整数,代表每张牌牌面上的点数。

输出描述

对于每组输入,输出题目描述中扑克游戏结束时,胜出者持有的牌面点数总和

示例1

输入:

6 2 5 3 2
1 2 3 4 5 6
12 3 10 5 3    
2 2 2 3 3 3 4 4 4 5 5 5

输出:

14
16

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 1331ms, 内存消耗: 49796K, 提交时间: 2019-12-15 12:18:08

#include<bits/stdc++.h>
using namespace std;
long long x[100005],t,y[100005],c[100005];
int main(){
	long long n,a,b,k,m,i,max1,j,s;
	while(~scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&k,&m)){
		for(i=0;i<n;i++){
			scanf("%lld",&x[i]);
			if(i>=b) y[i]=x[i];
		}
		k=k%b;
		for(i=0;i<b;i++){
			s=(i-(a*k)%b+b)%b;
			y[s]=x[i];	
		}
		max1=0;
		memset(c,0,sizeof(c));
		for(i=0;i<n;i++){
			c[i%m]+=y[i];
			if(c[i%m]>max1) max1=c[i%m];
		}
		printf("%lld\n",max1);
	}
} 





	

C++11(clang++ 3.9) 解法, 执行用时: 1000ms, 内存消耗: 2400K, 提交时间: 2020-03-16 21:06:38

#include<bits/stdc++.h>
using namespace std;
int A[200010];
long long ans[200010];
int main()
{
	long long n,a,b,k,m;
	while(cin>>n>>a>>b>>k>>m)
	{
		memset(ans,0,sizeof(ans));
		for(int i=1;i<=n;i++)
			scanf("%d",&A[i]);
		rotate(A+1,A+1+(k%b*a+b-1)%b+1,A+1+b);
		long long maxn=-1;
		for(int i=1;i<=n;i++)
			ans[(i-1)%m+1]+=A[i];
		for(int i=1;i<=m;i++)
			maxn=max(maxn,ans[i]);
		cout<<maxn<<endl;
	}
	return 0;
}

Python3(3.5.2) 解法, 执行用时: 1816ms, 内存消耗: 18924K, 提交时间: 2019-12-13 23:12:19

while True:
    try:
        n,a,b,k,m=map(int,input().split())
        l=list(map(int,input().split()))
        l=l[a*k%b:b]+l[:a*k%b]+l[b:]
        print(max([sum(l[i::m])for i in range(m)]))
    except:
        break

上一题