1. 冬至吃饺子
题目背景
今天是冬至日,是时候吃饺子了。今天中午,某学校大发善心说请所有同学在教学楼下集合,排成一横队,会免费发放饺子。当所有准备领取饺子的同学在楼下排好的时候,一位有强迫症的老师请所有的男同学站在所有女生的右边。我们已知每秒钟所有排在左边的男生会与他相邻的并且在右边的女生交换位置。问多少秒钟之后所有的男生会在所有的女生右边呢?
参与的同学人数不超过20000
题目描述
无
输入格式
本题无多次输入 M为男生。F为女生
输出格式 请输出所需要的秒数
输入输出样例
输入 MMFF
输出 3
思路:
对于最左边的女生,她需要的时间为她左边男生的个数,用m来记录男生的个数,若第二个女生与第一个女生相邻,那么该女生需要的时间为第一个女生所需时间加一,因为她会被第一个女生卡一下;若第二个女生与第一个女生不相邻,则她所需时间为m,即左侧男生的数量,以此类推,后面的女生所需时间为这两种情况的最大值,直到求出最后边的女生的时间,即为答案。
AC代码
#include <stdio.h>
#include <string.h>
int max(int a, int b)
{
if(a > b)
return a;
else
return b;
}
int main(void)
{
char a[20005];
int len, i, m = 0, ans = 0;
scanf("%s", a);
len = strlen(a);
for(i = 0; i < len; i++)
{
if(a[i] == 'M')
m++;
if(a[i] == 'F' && m > 0)
ans = max(ans + 1, m);
}
printf("%d", ans);
return 0;
}
2.挑剔的挑剔
题目背景
有个人叫挑剔,他这个人非常的挑剔,这一天,挑剔的挑剔给你出了一道挑剔的题。
题目描述
给你一个数n,要你在[0, 1e9]的范围内找到一个素数m,使|m - n|最小且,挑剔是非常挑剔的,他还要求你找到的数m尽可能的小。
输入格式
输入一个t,之后t行,每行一个数n。
输出格式
输出t行,每行一个数m。
说明/提示
1 <= t <= 100,0 <= n <= 1000000
思路:
先判断n是为素数,如果n为素数,那么最小的m就是它本身; 如果不是素数,就判断n - 1是为素数,如果还不是素数,就判断n + 1,然后n - 2, n + 2…直到出现素数
代码
#include <math.h>
int f(int a)
{
int j = -1, i, flag;
while(1)
{
flag = 1;//flag为1表示a为素数
for(i = 2; i <= sqrt(a); i++)
if(a % i == 0)
{
flag = 0;
break;
}
if(flag)
break;
else
{
a += j;
if(j > 0)
j++;
else
j--;
j *= -1;
}
}
return a;
}
int main(void)
{
int t, n;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
if(n == 0 || n == 1 || n == 2)
printf("2\n");
else
printf("%d\n", f(n));
}
return 0;
}