NC200383. 扑克游戏V4
描述
为了揭发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