NC14508. 幸运大奖
描述
tabris实在是太穷了,为了发财,tabris去买了一张彩票,幸运地中了特别奖。
特别奖是这样的,不会直接给你发钱.会给你一串二进制数s,让你在s中选择一个不大于k的区间,这个区间表示的数就是获奖者的奖金数目.
tabris中奖之后已经激动地蒙圈了,他不知道如何选择能获得最多的钱,你能帮帮他不?
输入描述
输入一个整数T(T≤10),代表有T组数据.
每组数据占两行.
第一行有一个整数K(k≤60),代表tabris能选择的数字区间的大小.
第二行有一个字符串s(∣s∣≤106).保证 k≤∣s∣
输出描述
输出一行"Case #x: y",x代表第x组数据,y代表tabris能得到的最多的钱。
示例1
输入:
3 1 10101 3 10101 5 10101
输出:
Case #1: 1 Case #2: 5 Case #3: 21
说明:
对于第一个样例,最大结果为1,选择 [1]0101,10[1]01,1010[1] 。C++14(g++5.4) 解法, 执行用时: 579ms, 内存消耗: 11264K, 提交时间: 2020-09-27 20:29:46
#include<bits/stdc++.h> using namespace std; typedef long long ll; int t,k; char s[1000005]; int main() { scanf("%d",&t); for(int tt=1;tt<=t;tt++){ scanf("%d",&k); scanf("%s",s); int len=strlen(s); ll ans=0; for(int i=0;i+k<=len;i++){ ll res=0,tmp=1; for(int j=i+k-1;j>=i;j--){ if(s[j]=='1'){ res+=tmp; } tmp*=2; } ans=max(ans,res); } printf("Case #%d: %lld\n",tt,ans); } }
Python3 解法, 执行用时: 1875ms, 内存消耗: 8524K, 提交时间: 2022-09-14 19:31:14
import sys from collections import deque input = lambda: sys.stdin.readline().rstrip("\r\n") il = lambda: int(input()) ill = lambda: map(int, input().split()) illl = lambda: list(map(int, input().split())) for text in range(il()): k=il() l=input() if k>=len(l): suma=int(l,base=2) else: suma=int(max(l[i:i+k]for i in range(len(l)-k)),base=2) print('Case #',text+1,': ',suma,sep='')
C++11(clang++ 3.9) 解法, 执行用时: 582ms, 内存消耗: 11232K, 提交时间: 2020-03-12 14:32:52
#include<stdio.h> #include<string.h> char s[2000000]; int main() { long long T,t,k,x,l,z,i,j; scanf("%lld",&T); t=T; while(t--) { scanf("%lld",&k); getchar(); scanf("%s",&s); l=strlen(s); for(x=i=0;i<=l-k;i++) { z=0; for(j=i;j<i+k;j++) { z=z*2+s[j]-'0'; } if(x<z) x=z; } printf("Case #%lld: %lld\n",T-t,x); } return 0; }