列表

详情


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] 。
对于第二个样例,最大结果是5,选择 [101]01,10[101]。
对于第三个样例,最大结果为21,选择 [10101]。

原站题解

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

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;
 } 

上一题