首页 > 编程语言 >第十四届C/C++研究生组省赛

第十四届C/C++研究生组省赛

时间:2023-11-08 17:25:14浏览次数:39  
标签:std Min int double cin C++ ++ 第十四届 组省赛

C. 翻转

首先如果第一个和最后一个棋子颜色不一样,那么是没办法用规则进行翻转的,输出 -1 。

如果第一个和最后一个颜色相同,则遍历该串,若当前遍历的棋子颜色不一样,则看两边棋子颜色是否与当前棋子不同,若不同则可以改变颜色,若有一个相同则不能改变颜色,输出 -1 。

#include <bits/stdc++.h>

int main() {
    int T;
    std::cin >> T;
    while (T -- ) {
        std::string s, p;
        std::cin >> s >> p;

        int result = 0;
        for (int i = 0 ; i < s.size() ; i ++ ) {
            if (s[i] != p[i]) {
                if (i == 0 || i == s.size() - 1) {
                    result = -1;
                    break;
                } else {
                    if (p[i - 1] != p[i] && p[i + 1] != p[i]) {
                        result ++ ;
                        p[i] = (p[i] == '0' ? '1' : '0');
                    } else {
                        result = -1;
                        break;
                    }
                }
            }
        }
        std::cout << result << "\n";
    }
    return 0;
}

D. 阶乘的和

将 \(A_i\) 从小到大进行排序,若 \(A_1\) 的数量为 \(A_2\) 的倍数,则可以将 \(A_1\) 转化为 \(A_2\)。

举例:
若有 3 3 3 3 4
则结果为 3! + 3! + 3! + 3! + 4! = 2 * 4!

按照该办法从小到大枚举,直到\(A_i\) 的数量不能刚好是 \(A_{i+1}\) 的倍数,或者 \(A_i\) 是最后一个元素,此时的 m 为\(A_i\)。

#include <bits/stdc++.h>

int main() {
	int n;
	std::cin >> n;
	std::map<int,int> mp;

	int Min = 2e9;
	for (int i = 0 ; i < n ; i ++ ) {
		int x;
		std::cin >> x;

		mp[x] ++ ;
		Min = std::min(Min,x);
	}

	while(mp[Min]) {
		if(mp[Min] % (Min + 1) == 0) {
			mp[Min + 1] += mp[Min] / (Min + 1);
			Min ++ ;
		} else break;
	}

	std::cout << Min << "\n";

	return 0;
}

E. 公因数匹配

首先用线性筛法将素数预处理出来,由于 \(A_i\) 的数据范围最大为 \(10^6\),则可以预处理出来在 \(10^6\) 以内的合数的所有质因子。
之后遍历该数列,用 pos 数组记录因子最先出现的位置,将相同因子的头两次出现位置保存起来,按照规则排序之后输出第一个数据。

#include <bits/stdc++.h>

const int N = 1000100;

int n;
int a[N];
bool st[N];
int pos[N];
int primes[N], cnt;
std::vector<int> v[N];

void get_primes(int n) {
	for (int i = 2 ; i <= n ; i ++ ) {
		
		if(!st[i]) primes[cnt ++ ] = i;
		for (int j = 0 ; primes[j] <= n / i ; j ++ ) {
			st[primes[j] * i] = true;
			if(i % primes[j] == 0) break;
		}
	}
	return ;
}


int main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	
	get_primes(N);

	for (int i = 0 ; i < cnt ; i ++ ) {
		for (int j = 1 ; j * primes[i] < N ; j ++ ) {
			v[j * primes[i]].push_back(primes[i]);
		}
	}


	std::cin >> n;
	for (int i = 0 ; i < n ; i ++ ) {
		std::cin >> a[i];
	}

	std::vector<std::pair<int,int>> res;

	for (int i = 0 ; i < n ; i ++ ) {
		int last = n + 1;
		for (auto &	t : v[a[i]]) {
			if(!pos[t]) {
				pos[t] = i + 1;
			} else {
				last = std::min(last,pos[t]);
			}
		}
		res.push_back({last,i + 1});
	}

	sort(res.begin(),res.end(),[](const std::pair<int,int> &a,const std::pair<int,int> &b){
        return a.first == b.first ? a.second < b.second : a.first < b.first ;
    });

    std::cout << res[0].first << " " << res[0].second << "\n";

	return 0;
}

G. 太阳

将每个线段投影到 x 轴上,由于投射到 x 轴上可能数据范围过大,这里要用离散化进行处理。
按照 y 值的大小顺序进行遍历,如果该线段有未被前面的线段遮挡的部分,则能被太阳照亮。

这里用bool数组存当前线段之前的线段有没有遮挡该区域。
觉得应该会超时,但是数据点全过了,应该是没有极限的数据?

#include <bits/stdc++.h>
#define N 100100

int n,X,Y;
struct Seg {
	int x,y,l;
}seg[N];

bool st[N * 3];
double sg[N][2];
double Numb[N * 3];

double Compute(double x, double y) {
	double result = (y / (y - Y)) * (X - x) + x;
	return result;
}

bool Compare(Seg &a, Seg &b) {
	return a.y > b.y;
}

int main() {
	std::cin >> n >> X >> Y;

	for (int i = 1 ; i <= n ; i ++ ) {
		int x,y,l;
		std::cin >> x >> y >> l; 
		seg[i] = {x,y,l};
	}

	std::sort(seg+1,seg+1+n,Compare);

	int idx = 0;
	for (int i = 1 ; i <= n ; i ++ ) {
		int x = seg[i].x, y = seg[i].y, l = seg[i].l;
		sg[i][0] = Compute(x,y), sg[i][1] = Compute(x + l,y);
		Numb[++ idx] = Compute(x,y), Numb[++ idx] = Compute(x + l, y);
	}

	std::sort(Numb + 1, Numb + 1 + idx);

	int result = 0;

	for (int i = 1 ; i <= n ; i ++ ) {
		int l = std::lower_bound(Numb + 1, Numb + 1 + idx, sg[i][0]) - Numb + 1;
		int r = std::lower_bound(Numb + 1, Numb + 1 + idx, sg[i][1]) - Numb + 1;

		int flag = 0;
		for (int k = l ; k < r ; k ++ ) {
			if(!st[k]) {
				flag = 1;
				st[k] = true;
			}
		}

		if(flag) result ++ ;
	}

	std::cout << result << "\n";

	return 0;
}

标签:std,Min,int,double,cin,C++,++,第十四届,组省赛
From: https://www.cnblogs.com/NachoNeko/p/17817853.html

相关文章

  • 【每日例题】蓝桥杯 c++ 绘制表格
    绘制表格题目蓝桥杯绘制表格题目分析阅读题目,我们可以将表格分为四个部分,头、中间的竖线部分与横线部分、尾。因此,我们可以启用多个for循环分别解决在第一行,我们也可以分为三个部分,第一部分符号为:“┌”,第二部分的中间部分使用for循环输入:“─┬”,第三部分符号为:“─┐”......
  • Visual C++ 6.0的快捷键
    F1-F12F1显示帮助,如果光标停在代码的某个字符上,显示MSDN中相应的帮助内容(需要安装MSDN才能使用)F2书签功能:Ctrl+F2--在某行设置一个书签(再按一次是取消)F2--跳到下一个书签位置Shift+F2--跳到上一个书签位置Ctrl+Shift+F2--删除所有书签F3查找:Ctrl+F3--在文件......
  • C语言程序设计 安装Visual C++ 6图示
    本示例安装VC6用于编写,编译和调试C语言。下载:首先从网上下载英文企业版VisualStudio6,约250-650M。迅雷下载:http://www.gougou.com/search?search=vc%2B%2B%206&id=0 英文企业版VisualStudio6安装图示:  ......
  • C++修饰符类型
    1、static静态存储修饰符:作用于变量时,使变量只被初始化一次,并且变量生命周期延长至和当前进程一致。作用于函数时,时函数只在当前文件中可见,调用权限只在当前文件。 2、const常量类型修饰符:作用于变量时,使该变量不可被更改。constintvalue=0;......
  • C#C++,opencv的dll中detach相关:关于调用dll后程序退出后进程仍然驻留系统列表的问题
    我在c#中调用C++的dll,内部使用了线程并detach使其独立于主线程UI运行。但后来发现程序关闭后,任务列表中的进场依然存在,即app并未实际正常退出。这个问题有很多人碰到和争论,但都没有给出明确的答案。这里提供一个理论解释和绝佳的调试排除方法:根本原因:程序退出之前,系统(或程序员......
  • windows 环境下dev c++安装第三方库
    参考资料https://blog.csdn.net/u011342183/article/details/79823564测试下载第三方库开发文件安装到devc++设置路径选择工具->编译器选项然后导入include路径......
  • C++全部操作符优先级整理
    优先级操作符描述例子结合性1()[]->.::++--调节优先级的括号操作符数组下标访问操作符通过指向对象的指针访问成员的操作符通过对象本身访问成员的操作符作用域操作符后置自增操作符后置自减操作符(a+b)/4;array[4]=2;ptr->age=34;obj.age=34;Class::......
  • C++基础随笔记录
    函数-值传递函数调用时,实参传递给形参。值传递时,形参改变,不会改变实参函数-4种形式无参无返有参无返无参有返有参有返函数-声明作用:告诉编译器函数名称以及如何调用函数。函数的主体可以单独定义。函数可以多次被声明,但是函数的定义只有一......
  • C++ 容器之 Vector
    什么是Vector?向量(Vector)是一个封装了动态大小数组的顺序容器(SequenceContainer)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。容器特性顺序序列顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序......
  • C++ 入门防爆零教程(上册)
    C++入门防爆零教程(上册)C++IntroductoryExplosionProofZeroTutorial(Volume\(1\))编写者:美公鸡(洛谷账号:beautiful_chicken233,电话:\(155****7747\),如有需要请随时联系)编写时间:\(2023.10.5\sim?\)地址:湖南省长沙市雨花区明升异城\(11\)栋\(3902\)出版社:美公鸡出版社P......