智算之道2020初赛第一场试题

第一题

排队

共 10 个测试点 

 每个测试点 10 分

每个测试点限时 1 秒 

 运行内存上限 512MB

查看本题最近一次测评结果

小 A 现在站在一个 n 个人的队伍里排队,他们的编号依次为 1∼n,现在她面前有 m 个窗口,其中第 i 个窗口会给出一个数字 ai​,然后将队伍中所有编号为 ai​ 倍数的人带出队伍,请问最后队伍中还剩下多少个人?

输入格式

第一行两个用空格隔开的整数分别表示 n,m

第二行 m 个用空格隔开的整数,其中第 i 个代表 ai​

输出格式

输出一个整数,代表剩下多少个人

数据规模与约定

对于 30% 的数据,1 <=n <= 100,1 <=m <=10

对于 60% 的数据,1 <= n <=1000, 1 <=m <=10

对于 100%的数据,1 <= n <=100000, 1 <=m <=100,1≤ai​≤n

样例输入

10 3
3 4 5

样例输出

3
#include
using namespace std;

int main() {
	int n;
	int m;
	cin >> n >> m;
	int a[100];
	int b[100000];
	for (int i = 1; i <= n; i++) {
		b[i] = 1;
	}
	for (int i = 0; i < m; i++) {
		cin >> a[i];
	}
	for (int i = 0; i < m; i++) {
		for (int j = 1; j <= n; j++) {
			if (j % a[i] == 0) {
				b[j] = 0;
			}
		}
	}
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		if (b[i] == 0) {
			sum++;
		}
	}
	cout << (n- sum);;
}

 

 

 

第二题

开关

共 10 个测试点 

 每个测试点 10 分

每个测试点限时 1 秒 

 运行内存上限 512MB

查看本题最近一次测评结果

小 B 面前有 n 个开关,开始时第 i 个开关的状态是 ai​,其中 ai​=1 表示第 i 个开关是开的,ai​=0 表示第 i 个开关是关的。现在 小 B 获得了一种魔法,他可以进行若干次操作,每次操作可以选择一个数 x,然后把 x 号开关及其之前的所有开关状态反转(开变关,关变开),请问小 B 最少需要多少次操作才能使所有开关都变为关的状态。

输入格式

第一行一个整数表示 n

第二行为一个长度为 n 的 01字符串,即每一位只会是 0 或者 1

输出格式

输出一个整数,表示最少需要多少次操作才能使所有开关都变为关的状态

数据规模与约定

对于 30%的数据,1≤n≤20

对于 60% 的数据,1≤n≤2000

对于 100% 的数据,1≤n≤200000

样例输入

4
1001

样例输出

3

 

 

#include
using namespace std;

int main() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	char c[200000];
	int a[200000];
	strcpy_s(c, s.c_str());
	for (int i = 0; i < n; i++) {
		a[i] = (int)(c[i] - '0');

	}
	int sum=0;
	for (int i = n - 1; i >= 0; i--) {
		if (a[i] == 1) {
			for (int j = 0; j <= i; j++) {
				if (a[j] == 0) {
					a[j] = 1;
				}
				else {
					a[j] = 0;
				}
			}
			sum++;
		}
	}
	cout << sum;
}

   解析:先把字符串转化为字符数组,再转化为int型数组,从后向前遍历数组,如果遇到0,则不管;遇到1,把这个数字及前面的数字0变1、1变0即可

第三题

字符串

共 10 个测试点 

 每个测试点 10 分

每个测试点限时 1 秒 

 运行内存上限 512MB

给定两个字符串 S 和 T,它们都只由小写字母组成。现在请计算出字符串 S 的本质不同的排列中有多少种是字符串 T 的子串。

本质不同,就是看起来不同,例如 aab 有 33 种本质不同的排列 aab, aba, baa

输入格式

第一行有一个字符串 S

第二行有一个字符串 T

输出格式

输出一个整数表示字符串 S的本质不同的排列中有多少种是字符串 T 的子串

数据规模与约定

对于 30% 的数据,1 <= |S|<= 5, 1 <= |T|<= 200

对于 60% 的数据,1≤∣S∣≤2000,1≤∣T∣≤2000

对于 100% 的数据,1≤∣S∣≤200000,1≤∣T∣≤200000

样例输入

aab
abacabaa

样例输出

2
#include  
#include  
#include  
int m;//记录字符串长度 
int n;//记录字符串中的字符种类数 
char map[256];//记录是哪几种字符 
int count[256];//记录每种字符有多少个 
char str1[1000]; 
int sum=0; 
void Make_Map(char *str)//统计字符串的相关信息 
{ 
    int s[256]; 
    int i; 
    memset(s,0,sizeof(s)); 
    memset(count,0,sizeof(count)); 
    m=strlen(str); 
    while(*str) 
    { 
        s[*str]++; 
        str++; 
    } 
    n=0; 
    for (i=0;i<256;i++) 
        if (s[i]) 
        { 
            map[n]=i; 
            count[n]=s[i]; 
            n++; 
        } 
} 
 
int stack[1000];//递归用的栈,并记录当前生成的排列 
 
void Find(int depth)//递归式回溯法生成全排列 
{  
        
        int k=0;
        if (depth==m) 
        { 
            
            int i; 
            char c[1000];
            for (i=0;i

  解析:先用递归式的回溯法生成全排列,然后再用库函数strstr(),判断是不是子字符串

你可能感兴趣的:(数据结构与算法)