1 切糖果
时间限制:3000MS
内存限制:589824KB
题目描述:
小美想要买糖果店的一根长长的糖果。糖果店顾客可以从中选取一个位置然后老板会在那切断,糖果前端到那个切断位置的糖果就会出售给这位顾客。这个糖果其实不同段有着不同的口味,小美希望她选出来的糖果中各个段有着不同的口味,在这基础上希望能选出尽可能长的糖果。小美想知道她能买到最长多长的糖果,请你帮帮她。
输入描述
第一行1个整数n,表示糖果的长度。
第二行n个整数a1,a2,…an,其中ai表示从糖果前端开始第i段的口味,每段均1为单位长度。
对于100%的数据,1≤n≤50000,1≤a≤50000
输出描述
输出一行一个整数表示能买到的糖果的最长长度,且其中不包含相同口味。
样例输入
5
1 2 3 3 4
样例输出
3
提示
如果我们买长度为4的糖果,包含的口味为[1,2,3,3],存在了重复。
而长度为3时,包含的口味为[1,2,3],不存在重复。因此长度3为最长的不存在重复口味糖果长度。
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> candy(n);
unordered_set<int> flavors;
int max_length = 0;
int start = 0;
for (int i = 0; i < n; i++) {
cin >> candy[i];
}
for (int end = 0; end < n; end++) {
while (flavors.count(candy[end])) {
flavors.erase(candy[start]);
start++;
}
flavors.insert(candy[end]);
max_length = max(max_length, end - start + 1);
}
cout << max_length << endl;
return 0;
}
2 橡皮泥 题目描述:
酷酷的小明准备和小伙伴们展示他捏出来的超酷的橡皮泥士兵。在展示之前,小明发现有些橡皮泥士兵大小十分相似甚至相同,这让小明感觉不是很酷,因为小明想要他的橡皮泥作品都有自己的风格,即使是大小也要有区别。
小明的n个橡皮泥士兵的大小分别为a1, a2, .…an,小明可以通过给某个士兵加一单位橡皮泥来使得其大小增加一单位。小明想知道如果他想要让所有的橡皮泥士兵大小都不相同,至少需要一共加多少单位橡皮泥。
输入描述
第一行1个整数n,表示小明的橡皮泥士兵数量。
第二行n个整数a1, a2, .…an,分别表示小明的橡皮泥士兵的大小。
对于100%的数据,1≤n≤50000 1≤ai≤100000
输出描述
输出一行一个整数表示总共至少加多少单位的橡皮泥。
样例输入
5
1 1 2 3 3
样例输出
5
提示
我们给一个大小为1的橡皮泥士兵增加4单位橡皮泥,大小变为5;
再给一个大小为3的橡皮泥士兵增加1单位橡皮泥,大小变为4。
此时橡皮泥士兵们的大小分别为1、2、3、4、5,没有两个橡皮泥士兵拥有相同大小了。
可以证明没有更优方案。
#include <iostream>
#include <unordered_map>
#include <bits/stdc++.h>
using namespace std;
int main() {
cin.tie(nullptr); cout.tie(nullptr);
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> sizes(n);
for (int i = 0; i < n; i++) {
cin >> sizes[i];
}
sort(sizes.begin(), sizes.end());
int additional_units = 0;
for (int i = 1; i < n; i++) {
if (sizes[i] <= sizes[i - 1]) {
additional_units += sizes[i - 1] - sizes[i] + 1;
sizes[i] = sizes[i - 1] + 1;
}
}
cout << additional_units << endl;
return 0;
}
3 小明的数组题目描述:
小明有一个数组。他挑选了一个有理数u/v,现在他想知道这个数组有多少个子区间的平均值恰好等于u/v。数组的子区间即是数组中连续的一段区间,如数组[4,2,6]有6个子区间[4],[2],[6],[4,2],[2,6],[4,2,6]。
输入描述
第一行有三个整数n,u,v(1≤n,v≤100000,1≤u≤n*v),代表数组的长度,小明选择的有理数的分子和分母。输入保证u和v的最大公因数是1,即u/v是最简分数。
第二行有n个绝对值不超过1000000的整数,代表数组中的元素。
数字间两两有空格隔开。
输出描述
输出一个非负整数,代表所求的答案。
样例输入
6 5 2
2 4 1 3 2 3
样例输出
6
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, u, v;
cin >> n >> u >> v;
vector<int> arr(n);
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int count = 0;
for (int i = 0; i < n; i++) {
int sum = 0;
int num = 0;
for (int j = i; j < n; j++) {
sum += arr[j];
num++;
if (num * u == sum * v) {
count++;
}
}
}
cout << count << endl;
return 0;
}
//#include <iostream>
//#include <bits/stdc++.h>
//using namespace std;
//
//int main() {
// string s ;
// cin >> s;
// //cout << (s.find('.') == -1) << endl;
//
//
// if (s.size() < 2 || s.size() > 255 || s.find('.') == -1) {
// cout << "false" << endl;
// return 0;
// }
// vector<string> biaoqian;
// int begin = 0;
// for (int i = 0; i < s.size();++i) {
// if (s[i] == '.') {
// biaoqian.push_back(s.substr(begin, i - begin));
// begin = i + 1;
// }
// }
// biaoqian.push_back(s.substr(begin, s.size() - begin));
//
// for (int i = 0;i < biaoqian.size()-1 ;i++) {
// if (biaoqian[i][0] == '-' || biaoqian[i][biaoqian[i].size() - 1] == '-') {
// cout << "false" << endl;
// return 0;
// }
// for (int x = 0; x < biaoqian[i].size();++x) {
// if ((biaoqian[i][x] >= '0' && biaoqian[i][x] <= '9') || (biaoqian[i][x] >= 'a' && biaoqian[i][x] <= 'z') ||
// (biaoqian[i][x] >= 'A' && biaoqian[i][x] <= 'Z') || biaoqian[i][x] == '-')
// continue;
// else
// {
// cout << "false" << endl;
// return 0;
// }
// }
// }
// if (biaoqian[biaoqian.size() - 1].size() < 2) {
// cout << "false" << endl;
// return 0;
// }
// for (int x = 0; x < biaoqian[biaoqian.size() - 1].size();++x) {
// if ((biaoqian[biaoqian.size() - 1][x] >= 'a' && biaoqian[biaoqian.size() - 1][x] <= 'z') ||
// (biaoqian[biaoqian.size() - 1][x] >= 'A' && biaoqian[biaoqian.size() - 1][x] <= 'Z') )
// continue;
// else
// {
// cout << "false" << endl;
// return 0;
// }
// }
// cout << "true" << endl;
// return 0;
//}
64 位输出请用 printf("%lld")
//
//#include <iostream>
//#include <bits/stdc++.h>
//using namespace std;
//#define LL long long
//int main() {
// /*LL n;
// cin >> n;*/
// //string s = "113343435999999999";
//
// string s;
// cin >> s;
// LL maxNum = stoll(s);
//
// for (int i = 0;i < s.size();i++) {
// char num = s[0];
// for (int i = 0;i < s.size()-1;i++) {
// s[i] = s[i + 1];
// }
// s[s.size() - 1] = num;
// maxNum = max(maxNum, stoll(s));
// //cout << "1111111111" << endl;
// }
// cout << maxNum << endl;
//
// return 0;
//}
#include <iostream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
#define LL long long
int main() {
string s;
cin >> s;
//do {
// cout << s << endl;
//} while (next_permutation(s.begin(),s.end()));
return 0;
}