虽然已经在组里学习了近一个月,但碰到难题还是被困住了,比如这次三道题把我揍得体无完肤,下面就这三道题做下总结
1.
有多少个子字符串至少包含k(1 \leq k \leq 26) k(1≤ k≤26)不同的角色?
输入
有多个测试用例。输入的第一行包含一个整数T (1\leq T\leq 10)T(1≤T≤10)指示测试用例的数量。对于每个测试用例:
第一行包含字符串SS.
第二行包含一个整数k(1 \leq k \leq 26)k(1≤k≤26).
输出
对于每个测试用例,输出至少包含的子字符串数kk字符。
示例输入
2 abcabcabca 4 abcabcabcabc 3
示例输出
0 55
#include <stdio.h>
struct zifuchuan {
char s[1000009];
} a[12];
int main() {
int b[12], count = 0, count1 = 0, c[12] = {0};
int n, p, o;
scanf("%d", &n);
for (p = 0; p < n; p++) {
scanf("%s", a[p].s);
scanf("%d", &b[p]);
}
int i, j, k;
for (p = 0; p < n; p++) {
for (i = 0; a[p].s[i] != '\0'; i ++) {
for (k = 1; a[p].s[k + i - 1]; k ++) {
for (j = 0; j < k; j ++) {
for (o = 0; o < j; o++) {
if (a[p].s[i + o] == a[p].s[i + j] )
count++;
}
if (count == 0)
count1++;
count = 0;
}
if (count1 >= b[p])
c[p]++;
count1 = 0;
}
}
printf("%d\n", c[p]);
}
}
孩子真的不会用双指针写,马上去问。
循环的写起来比较麻烦,核心就是先罗列每个子序列,再来判断他其中不同元素的个数。
2.
输入:
输入的第一行包含一个整数 T(1<=T<=20),表示测试用例的数量。然后是 T 行,每行以数字 N(1<=N<=100000 开头),然后是 N 个整数(所有整数都在 -1000 和 1000 之间)。
输出:
对于每个测试用例,应输出两行。第一行是"案例 #:",# 表示测试用例的编号。第二行包含三个整数,序列中的最大和,子序列的起始位置,子序列的结束位置。如果有多个结果,则输出第一个结果。在两个事例之间输出一个空行。
示例输入:
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
示例输出:
Case 1: 14 1 4 Case 2: 7 1 6
#include <stdio.h>
int main() {
int i, n, count, j, a[100005] = {0};
scanf("%d", &n);
for (j = 0; j < n; j++) {
scanf("%d", &count);
for (i = 0; i < count; i++)
scanf("%d", &a[i]);
int d = -1001, s = 0, p = 1, l, r;
for (i = 0; i < count; i++) {
s += a[i];
if (s > d) {
d = s;
l = p;
r = i + 1;
}
if (s < 0) {
s = 0;
p = i + 2;
}
}
printf("Case %d:\n%d %d %d\n", j, d, l, r);
if (j != n)
printf("\n");
}
}
核心思想就是从头开始判断两数之和,如果加上第二个数之后大于第一个数,那就让右坐标移一,如果加上之后小于零,那前面所有加过的数都不要了,重新给左坐标赋值,再进行接下来的判断,如果没有出现上述两种情况,那就先继续加,静观其变,直到出现上面两种情况时再做判断。
3.
例如,考虑产品 Prod={a,b,c,d} 且 (pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2) 和 (pd,dd)=(30,1)。可能的销售时间表列于表1中。例如,计划 Sell={d,a} 显示产品 d 的销售从时间 0 开始,到时间 1 结束,而产品 a 的销售从时间 1 开始,在时间 2 结束。这些产品中的每一个都在截止日期前售出。卖出是最佳计划,其利润为80。
编写一个程序,从输入文本文件中读取产品集,并计算每组产品的最佳销售计划的
利润。
输入
输出
示例输入
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2
5 20 50 10
示例输出
80
185
提示
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; struct shangpin { int lirun; int tianshu; }aa[10000]; int cmp(shangpin a,shangpin b) { return a.lirun>b.lirun; } int main() { int i,j,n,sum; while(scanf("%d",&n) != EOF){ for(i=0;i<n;i++) scanf("%d%d",&aa[i].lirun,&aa[i].tianshu); sort(aa,aa+n,cmp); for(int tian=0;tian<10000;tian++) { for(i=0;i<n;i++) { if(aa[i].tianshu==tian) { sum=sum+aa[i].lirun; break; } } } printf("%d\n",sum-1); sum=1; } }
这里也是借鉴了同组成员的代码,核心还是把利润大的放前面,然后把所有所在天数里利润最大的放进计划就行了。