A.组队比赛
枚举法
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include <climits>
int st[2002], gt[2002];
int main()
{
int a[22], k = 0;
for (int i = 0; i < 4; i++)
{
scanf("%d", &a[i]);
}
for (int i = 0; i < 4; i++)
{
for (int j = i + 1; j < 4; j++)
{
st[k] = a[i] + a[j];//4人选2人组合枚举
for (int w = 0; w < 4; w++)
{
if (w != i && w != j)//另外两人枚举
{
gt[k] += a[w];
}
}
k++;
//printf("%d\n", st[k - 1]);
}
}
int t = st[0];
int MIN = 0x3f3f3f3f;
for (int i = 1; i < k; i++)//比较
{
if (fabs(st[i] - gt[i]) < MIN)
{
MIN = fabs(st[i] - gt[i]);
}
}
printf("%d\n", MIN);
}
B. 每日一报
结构体,排序规则函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node//题目描述的数据结构
{
int day;
int id;
double temp;
}p[502];
struct cmp//排序规则函数
{
bool operator()(const node& t1, const node& t2)
{
if (t1.day != t2.day)
{
return t1.day > t2.day;
}
else if (t1.temp != t2.temp)
{
return t1.temp > t2.temp;
}
return t1.id < t2.id;
}
};
int main()
{
int n, a, b, k = 0;
double c;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d%lf", &a, &b, &c);
if (c < 38)//筛选不正常数据
{
continue;
}
p[k].day = a, p[k].id = b, p[k++].temp = c;
}
sort(p, p + n, cmp());
printf("%d\n", k);
for (int i = 0; i < k; i++)
{
printf("%d %d %.1lf\n", p[i].day, p[i].id, p[i].temp);
}
};
C.最长非公共子序列
一开始以为是DP,后来发现只有两种情况,即字符串相同和不同的情况
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
char p[5005], q[5005];
scanf("%s%s", p, q);
if (strcmp(p, q) == 0)//字符串相同
{
printf("-1\n");
return 0;
}
printf("%d\n", max(strlen(p), strlen(q)));//字符串不同
}
D.最大字符集
构造题,要求寻找一定长度范围内的所有独立的01字符串集合(即不包含集合内别的字符串的子串)
这波啊,这波是搜索
由于数据范围较小(n<300),且题目限制每种长度的字符串只能有1个,要求得的解空间范围较小(
如111111
显然更替0的位置,便能产生不同的独立字符串
如 111110,111101,111011,110111,101111,011111
根据题目要求,每种长度的字符串只能有一种,所以每次搜索我们舍去尾端的1,同时移动0相对于1的位置
即1111111->111110->11101->1011
到达最左端了要怎么构造呢?毕竟n>2时的字符串数达到n-1才能达到理论最大值,因为0和1必然是别的字符串的子串。
我们可以在一个字符串里使用两个0继续构造,两个0使字符串灵活了许多,构造便容易多了。
如:
011110->01110->0110->010->00
这种构造方式容易实现
所以我们在第一次搜索搜不动时,使用第二次搜索。
// An highlighted block
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void dfs2(int len)//第一次构造无法继续时开始第二种构造法
{
if (len < 2)
return;
printf("0");
for (int i = i = 0; i < len - 2; i++)
{
printf("1");
}
printf("0\n");
dfs2(len - 1);
}
void dfs(int len, int pos, int count)
{
if (count > len)//0的数量要求比字符串还长时返回
{
return;
}
for (int i = 0; i < len; i++)//构造字符串
{
if (i == pos)
{
int j;
for (j = 0; j < count; j++)
{
printf("0");
}
i += j - 1;
continue;
}
printf("1");
}
printf("\n");
if (pos > 1)
{
dfs(len - 1, pos - 2, count);//字符串长度-1,0的位置左移2位
}
else dfs2(len - 1);//0的位置使搜索不能再继续了,开始第二次搜索
}
int main()
{
int n;
scanf("%d", &n);
if (n < 3)
{
printf("%d\n", n);
}
else printf("%d\n", n - 1);
dfs(n, n, 1);//字符串长度,0的位置(此刻没有0),0的数量
}
E. 美味的序列
贪心,优先选择数值大的数据,这样能带来更大利润
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005];
int main()
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + n);
int count = 0;
long long sum = 0;
for (int i = 0; i < n; i++)
{
sum += a[i] - count;
count++;
}
printf("%lld\n", sum);
}
F. 日期小助手
模拟,日期类问题要注意闰年处理,分类讨论,以及求第几个星期几时的日期循环处理
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int moon[3000];
int fa[3000];
int main()
{
moon[2000] = 14;
for (int i = 2001; i <= 2100; i++)//求母亲节日期
{
if (!(i % 4 == 0 && i % 100 != 0))
{
moon[i] = moon[i - 1] - 1;
if (moon[i] == 7)
moon[i] = 14;
}
else {
moon[i] = moon[i - 1] - 2;
if (moon[i] == 7)
moon[i] = 14;
if (moon[i] == 6)
moon[i] = 13;
}
}
fa[2000] = 18;
for (int i = 2001; i <= 2100; i++)//求父亲节日期
{
if (!(i % 4 == 0 && i % 100 != 0))
{
fa[i] = fa[i - 1] - 1;
if (fa[i] == 14)
fa[i] = 21;
}
else {
fa[i] = fa[i - 1] - 2;
if (fa[i] == 14)
fa[i] = 21;
if (fa[i] == 13)
fa[i] = 20;
}
}
int n, a, b, c;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d%d", &a, &b, &c);//注意日期下标
if (b < 5 || b == 5 && c < moon[a])
{
if (moon[a] == 1 || moon[a] == 21 || moon[a] == 31)
printf("Mother's Day: May %dst, %d\n", moon[a], a);
else if (moon[a] == 2 || moon[a] == 22)
printf("Mother's Day: May %dnd, %d\n", moon[a], a);
else if (moon[a] == 3 || moon[a] == 23)
printf("Mother's Day: May %drd, %d\n", moon[a], a);
else printf("Mother's Day: May %dth, %d\n", moon[a], a);
}
else if (b > 6 || b == 6 && c >= fa[a])
{
if (moon[a + 1] == 1 || moon[a + 1] == 21 || moon[a + 1] == 31)
printf("Mother's Day: May %dst, %d\n", moon[a + 1], a + 1);
else if (moon[a + 1] == 2 || moon[a + 1] == 22)
printf("Mother's Day: May %dnd, %d\n", moon[a + 1], a + 1);
else if (moon[a + 1] == 3 || moon[a + 1] == 23)
printf("Mother's Day: May %drd, %d\n", moon[a + 1], a + 1);
else printf("Mother's Day: May %dth, %d\n", moon[a + 1], a + 1);
}
else {
if (fa[a] == 1 || fa[a] == 21 || fa[a] == 31)
printf("Father's Day: June %dst, %d\n", fa[a], a);
else if (fa[a] == 2 || fa[a] == 22)
printf("Father's Day: June %dnd, %d\n", fa[a], a);
else if (fa[a] == 3 || fa[a] == 23)
printf("Father's Day: June %drd, %d\n", fa[a], a);
else printf("Father's Day: June %dth, %d\n", fa[a], a);
}
}
}