博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #FF (Div. 2) 题解
阅读量:4914 次
发布时间:2019-06-11

本文共 5829 字,大约阅读时间需要 19 分钟。

比赛链接:http://codeforces.com/contest/447
A. DZY Loves Hash
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

DZY has a hash table with p buckets, numbered from 0 to p - 1. He wants to insert n numbers, in the order they are given, into the hash table. For the i-th number xi, DZY will put it into the bucket numbered h(xi), where h(x) is the hash function. In this problem we will assume, that h(x) = x mod p. Operation a mod b denotes taking a remainder after division a by b.

However, each bucket can contain no more than one element. If DZY wants to insert an number into a bucket which is already filled, we say a "conflict" happens. Suppose the first conflict happens right after the i-th insertion, you should output i. If no conflict happens, just output -1.

Input

The first line contains two integers, p and n (2 ≤ p, n ≤ 300). Then n lines follow. The i-th of them contains an integer xi (0 ≤ xi ≤ 109).

Output

Output a single integer — the answer to the problem.

Sample test(s)
input
10 5021534153
output
4
input
5 501234
output
-1

链接:http://codeforces.com/contest/447

题意:找出hash时第一次产生冲突的位置。

解题思路:用一个数组表示是否存放有hash之后的元素,0表示这个位置还没有使用过。1表示这个位置上有hash之后的元素(即产生了冲突)。

代码:

#include 
#include
const int MAXN = 305;int a[MAXN], p, n, ans = -1;int main(){ bool flag = true; scanf("%d%d", &p, &n); for(int i = 0; i < n; i++) { int x; scanf("%d", &x); if(flag) { if(0 == a[x % p]) { a[x % p] = 1; } else { ans = i + 1; flag = false; } } } printf("%d\n", ans); return 0;}

B. DZY Loves Strings
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

DZY loves collecting special strings which only contain lowercase letters. For each lowercase letter c DZY knows its value wc. For each special string s = s1s2... s|s| (|s| is the length of the string) he represents its value with a function f(s), where

Now DZY has a string s. He wants to insert k lowercase letters into this string in order to get the largest possible value of the resulting string. Can you help him calculate the largest possible value he could get?

Input

The first line contains a single string s (1 ≤ |s| ≤ 103).

The second line contains a single integer k (0 ≤ k ≤ 103).

The third line contains twenty-six integers from wa to wz. Each such number is non-negative and doesn't exceed 1000.

Output

Print a single integer — the largest possible value of the resulting string DZY could get.

Sample test(s)
input
abc31 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
output
41
Note

In the test sample DZY can obtain "abcbbc", value = 1·1 + 2·2 + 3·2 + 4·2 + 5·2 + 6·2 = 41.

链接:http://codeforces.com/contest/447/problem/B

题意:在给出的字符串中添加k个字符,求能够得到的最大权值和。

解题思路:找出最大的位权,将k个有最大位权的字符放到原字符串的末尾。求权值和。ps:答案可能会超出int。要用long long

代码:

#include 
#include
using namespace std;int main(){ string s; int k, a[27], imax = -1; cin >> s >> k; for(int i = 0; i < 26; i++) { cin >> a[i]; if(a[i] > imax) { imax = a[i]; } } long long ans = 0; int len = s.length(); for(int i = 0; i < len; i++) { ans += a[s[i] - 'a'] * (i + 1); } ans += (long long)imax * k * (2 * len + k + 1) / 2; cout << ans << endl;}
C. DZY Loves Sequences
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

DZY has a sequence a, consisting of n integers.

We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ≤ n) a subsegment of the sequence a. The value (j - i + 1) denotes the length of the subsegment.

Your task is to find the longest subsegment of a, such that it is possible to change at most one number (change one number to any integer you want) from the subsegment to make the subsegment strictly increasing.

You only need to output the length of the subsegment you find.

Input

The first line contains integer n (1 ≤ n ≤ 105). The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109).

Output

In a single line print the answer to the problem — the maximum length of the required subsegment.

Sample test(s)
input
67 2 3 1 5 6
output
5
Note

You can choose subsegment a2, a3, a4, a5, a6 and change its 3rd element (that is a4) to 4.

链接:http://codeforces.com/contest/447/problem/C

题意:从一串数字中选出一个子串。能够改变子串中一个数字的值得到一个新的子串,求最大的递增新子串的长度。

解题思路:

将原数组切割成递增的子串,记录下每一个子串的開始和结束位置,以及长度。

接下来要分几种情况讨论:1.相邻的两个子串改变一个数字之后,能够合并形成新的递增子串。2.相邻的3个子串,中间子串长度为1。改变中间的数字后能够形成新的递增子串,3.相邻的子串不能合并形成新的递增子串,可是能够在原串的基础上。得到一个长度添加1的新的递增子串(在子串开头位置前有数字。或是结束位置后有数字)。

代码:

#include 
#include
#include
using namespace std;const int MAXN = 100010;int a[MAXN];struct P{ int l, len, r;};P p[MAXN];int n;int main(){ memset(p, 0, sizeof(p)); scanf("%d", &n); int t = 0; for(int i = 0; i < n; i++) { scanf("%d", &a[i]); if(!i) { p[t].len++; p[t].l = p[t].r = i; continue; } if(a[i] <= a[i - 1]) { t++; } if(0 == p[t].len) { p[t].l = i; } p[t].len++; p[t].r = i; } int ans = p[0].len < n ?

p[0].len + 1 : p[0].len; for(int i = 1; i <= t; i++) { ans = max(ans, p[i].len + 1); if(a[p[i].l] > a[p[i - 1].r - 1] + 1 || a[p[i].l + 1] > a[p[i - 1].r] + 1) { ans = max(ans, p[i].len + p[i - 1].len); } if(i >= 2 && 1 == p[i - 1].len && a[p[i].l] > a[p[i - 2].r + 1]) { ans = max(ans, p[i].len + p[i - 2].len + 1); } // printf("%d \n", p[i].len); } printf("%d\n", ans); return 0; }

转载于:https://www.cnblogs.com/ldxsuanfa/p/10752047.html

你可能感兴趣的文章
phpadmin dvwa sqli-labs xsser.me
查看>>
OPENCV(2) —— Basic Structures(二)
查看>>
SDUT 3346 数据结构实验之二叉树七:叶子问题
查看>>
正则表达式介绍
查看>>
linux 比较命令
查看>>
软件工程学习心得4
查看>>
车机HMI开发过程中的功能安全方案
查看>>
我要上蓝翔
查看>>
Ping pong(树状数组经典)
查看>>
Mysql 语句优化
查看>>
记一次面试
查看>>
例子:进度条
查看>>
二叉树
查看>>
kubernetes安装记录
查看>>
easyui 回车搜索
查看>>
SAP 使用SQL Trace(ST05)
查看>>
P4777 【模板】扩展中国剩余定理(EXCRT)&& EXCRT
查看>>
[PowerShell]Quote in String
查看>>
Workpress搭建经验 (ubuntu16.04+nginx+mysql+php7)
查看>>
Java List详解
查看>>