通师高专科技创新社月赛Round 6

A题

思路

  • 1.按题意输入输出即可

坑点

  • 1.无

总结

签到题。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int a, b;
	cin >> a >> b;
	cout << a / b << " " << a % b << endl;
	return 0;
}

B题

思路

  • 1.全排列,判断一下给的数是第几次出现的即可。
    不会的可以参考全排列

坑点

  • 1.无

总结

递归模板题。

代码

#include<bits/stdc++.h>
using namespace std;
int n;
int flag;
bool res[300]={
    
    0};
int ans[300];
bool f = 0;
int bbb=0;
int aa=0;
void dfs(int u)
{
    
    
    if(u > n)
    {
    
    
    	int sum = 0;
		aa++;
        for (int i = 1; i <= n; i ++)
        {
    
    
			sum = sum * 10 + ans[i];
        }
		if (sum == flag)
		{
    
    
			bbb = aa;
		}
        return;
    }
    for (int i = 1; i <= n; i ++ )
    {
    
    
        if(res[i] == 0)
        {
    
    
            ans[u] = i;
            res[i] = 1;
            dfs(u + 1);
            res[i]=0;
        }
    }
}
int main()
{
    
    
    cin >> n;cin >> flag;
    dfs(1);
    cout << bbb << endl;
    return 0;
}

C题

思路

  • 1.因为数据范围很大,所以要用string形式读入。
  • 2.然后通过s[i] - '0'把字符转换成数字,把该数字定义为a。
  • 3.初始化数组hash[10] = {0};
  • 4.然后标记hash[a] = 1;代表a出现过,若没有出现过就是0。
  • 5.对输入的第二个字符串重新开一个数组,重复以上操作。
  • 6.最后用i遍历0 ~ 9,看如果记录两个字符串里当前i出现次数的都不为0,那么说明这一位数字在两个
  • 7.字符串中都出现过,那么就输出这个数。
  • 8.如果一个数都没有,就输出-1。

坑点

  • 1.要开long long

总结

哈希,字符串。

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
int hash1[100];
int hash2[100];
signed main()
{
    
    
	string s1, s2;
	cin >> s1 >> s2;
	for (int i = 0; i < s1.length(); i ++ ) 
	{
    
    
		hash1[s1[i] - '0'] = 1;
	}
	for (int i = 0; i < s2.length(); i ++ ) 
	{
    
    
		hash2[s2[i] - '0'] = 1;
	}
	bool f = 0;
	for (int i = 0; i <= 9; i ++ )
	{
    
    
		if (hash1[i] != 0 && hash2[i] != 0) 
		{
    
    
			f = 1;
			cout << i << " ";
		}
	}
	if (!f) cout << -1;
	return 0;
}

D题

思路

  • 1.通过观察可发现,每次取最大的数两个数然后把这两个数删掉可以得到min,每次选最小的两个数删掉可以得到max, 再放进去。
  • 2.做法:使用优先队列,优先队列可以自动实现排序,详细用法:优先队列用法

坑点

  • 1.无。

总结

优先队列。

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	priority_queue<int, vector<int>, less<int>> q;
	priority_queue<int, vector<int>, greater<int>> q1;
	int n; cin >> n;
	for (int i = 1; i <= n; i ++ )
	{
    
    
		int x; cin >> x;
		q1.push(x);
		q.push(x);
	}
	int nnn; cin >> nnn;
	while (q1.size() > 1)
	{
    
    
		int a = q1.top();
		q1.pop();
		int b = q1.top();
		q1.pop();
		q1.push(a * b + 1);
	}
	while (q.size() > 1)
	{
    
    
		int a = q.top();
		q.pop();
		int b = q.top();
		q.pop();
		q.push(a * b + 1);
	}
	cout << q1.top() - q.top() << endl;
	return 0;
}

E题

题解

戳这里

总结

考察了一些思维能力和二分答案。

Guess you like

Origin blog.csdn.net/qq_34682765/article/details/121591808