首页 > 其他分享 >200天1000题 (DAY 7)

200天1000题 (DAY 7)

时间:2022-09-21 22:34:00浏览次数:102  
标签:200 return cout int cin Codeforces sensei DAY 1000

200天1000题 (DAY 7)

目前总题数: 32

目前CF分数: 1325

T1 (Codeforces Edu.#130 Div. 2)C. awoo's Favorite Problem

/*
	题目大意:
		给你两个字符串 s,t
		你可以对s进行如下操作任意次:
		1. 把s中某个字串"ab"变为"ba"
		2. 把s中某个字串"bc"变为"cb"
		问,是否能够在任意次操作后使得s==t

*/

/*
	题解:
		首先应该关注到这两个操作 "ab"变"ba" ,"bc"变"cb"
		这意味这 a和c的相对位置是不可变的
		而b则是可以“出现在”任意位置
		
		所以我们首先要判断一下 去除掉 b后的s和t是否相同
		如果不同那么就肯定不能
		
		如果同,我们观察到,a永远只能从左边的位置变到右边的位置,c则是只能从某个右边的位置变到左边的位置
		所以我们可以开几个数组分别记录一下s中c,a的下标以及t中c,a的下标
		判断是否符合上述规则,如果不符合,直接输出NO
		符合上述所有规则,那么就是可以的
*/

inline void sensei()
{
	int n;
	cin >> n;
	string s, t;
	cin >> s  >> t;
	string c, d;
	c = d = "";
	for (auto &i : s) {
		if (i == 'a') c += "a";
		if (i == 'c') c += "c";
	}
	for (auto &i : t) {
		if (i == 'a') d += "a";
		if (i == 'c') d += "c";
	}
    if(d!=c){
        cout << "NO" << endl;
        return ;
    }
    vector<int> sa,sc,ta,tc;
    for(int i=0;i<s.size();i++){
        if(s[i] == 'a') sa.pb(i);
        if(s[i] == 'c') sc.pb(i);
        if(t[i] == 'a') ta.pb(i);
        if(t[i] == 'c') tc.pb(i);
    }
    if(sa.size()!=0){
        for(int i=0;i<sa.size();i++){
            if(sa[i] > ta[i]) {
                cout << "NO" << endl;
                
                return ;
            }
        }
    }
    
    if(sc.size()!=0){
        for(int i=0;i<sc.size();i++){
            if(sc[i] < tc[i]){
                cout << "NO" << endl;
                debug("haha");
                return ;
            }
        }
    }
    cout << "YES" << endl;
}

signed main()
{
#ifndef LOCAL
	fuckios
#endif

	int t;
	cin >> t;
	while (t --) {
		sensei();
	}

	return 0;
}

T2. (Codeforces Edu#99 Div. 2) C. Ping-pong

/*
	题目大意:
		给你两个数字a,b
		表示alice的体力和bob的体力
		他们要进行乒乓球比赛
		第一轮中 alice 先发球
		在每一轮比赛中,每个人可以选择回球或者不回球
		不回球者输掉这轮比赛,回球者体力减1
		每轮的胜利者下一轮接着发球
		问如果他们以最优的策略进行游戏,那么他们的最大得分分别是多少?
		
		
		
	题解:
		观察可得 alice最多赢得体力-1分
		bob最多可赢得b分
		
		
*/

inline void sensei()
{
    int a,b;
    cin >> a >> b;
    cout << a-1 << ' ' << b << endl;
}

signed main()
{
#ifndef LOCAL
    fuckios
#endif
    
    int t;
    cin >> t;
    while(t --){
        sensei();
    }
    
    return 0;
}

T3 (Codeforces #792 DIV.1+DIV.2) C. Column Swapping

/*
	暴力,就是代码容易写假()
*/


const int N = 1e6 + 10;

inline void sensei()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> g(n + 1, vector<int>(m + 1));
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> g[i][j];
		}
	}

	set<int> pos;
    vector<int> npos;
	for (int i = 1; i <= n and npos.empty(); i++) {
		vector<int> alls = g[i];
		sort(alls.begin() + 1, alls.begin() + 1 + m);
		for (int j = 1; j <= m; j++) {
			if (alls[j] != g[i][j]) {
				pos.insert(j);
                npos.push_back(j);
			}
		}
	}
	if (npos.size() > 2) {
		cout << -1 << endl;
		return ;
	}
	if (npos.size() == 0 ) {
		cout << 1 << ' ' << 1 << endl;
		return ;
	}
	if (npos.size() == 1) {
		cout << npos[0] << ' ' << npos[0] + 1 << endl;
		return ;
	}
    debug(npos[0]);
    debug(npos[1]);
	if (pos.size() == 2) {
		for (int i = 1; i <= n; i++) {
			swap(g[i][npos[0]], g[i][npos[1]]);
		}
	}

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m-1;j++){
            if(g[i][j] > g[i][j+1]){
                cout << "-1" << endl;
                return ;
            }
        }
    }
    cout << npos[0] << ' ' << ' ' << npos[1] << endl;
}

signed main()
{
#ifndef LOCAL
	fuckios
#endif

	int t;
	cin >> t;
	while (t --) {
		sensei();
	}

	return 0;
}

T4 (Codeforces #758 DIV1+ DIV2) B. Build the Permutation

/*
	题意:
		给你三个数字 n,a,b
		要求你构造出 任意一个长度为n,有a个局部最大,b个局部最小的序列
		局部最大: 对于a[i] 有 a[i-1] < a[i] > a[i+1]
		局部最小, 对于a[i] 有 a[i-1] > a[i] < a[i+1]
		如果这样的序列不存在,则输出-1
		
*/

/*
	首先观察得出
	如果a和b相差大于1 则必定不可能
	其次 a+b也必须小于n-2
	
	后面就是构造了,详细见代码
*/

inline void sensei()
{
	int n, a, b;
	cin >> n >> a >> b;
	
	if (abs(a - b) > 1) {
		cout << -1 << endl;
		return ;
	}
	if (a + b > (n - 2)) {
		cout << -1 << endl;
		return ;
	}

	vector<int> ans(n + 1, 0);
	for (int i = 1; i <= n; i++) ans[i] = i;

	if (a == b) {
		for (int i = 1; i <= a; i++)
			swap(ans[i * 2], ans[i * 2 + 1]);

	} else if (a > b) {
		for (int i = 1; i <= a; i++) {
			swap(ans[i * 2], ans[i * 2 - 1]);
		}
	} else {
		for (int i = 1; i <= b; i++) {
			swap(ans[i * 2], ans[i * 2 - 1]);

		}
	}
    
    if(a - b == 1){
        for(int i=1;i<=n;i++){
            ans[i] = -ans[i]+n+1;
        }
    }
    
    for(int i=1;i<=n;i++){
        cout << ans[i] << " \n"[i==n];
    }


}

signed main()
{
#ifndef LOCAL
	fuckios
#endif


	int t;
	cin >> t;
	while (t --) sensei();

	return 0;
}

标签:200,return,cout,int,cin,Codeforces,sensei,DAY,1000
From: https://www.cnblogs.com/BeB0p/p/16717405.html

相关文章

  • day1 二分查找
    二分查找要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。例题704.二分查找思路:单纯的二分查......
  • Windows 10 版本 2004 以下安装 WSL
    安装Linux官方文档旧版WSL的手动安装步骤由于Windows版本实在太老,不能安装WSL2。手动安装这里选择下载KaliLinux发行版进行安装。下载安装后,『开始』->『K......
  • day1 python学习前言
    ......
  • day01
    day1二分查找二分查找涉及很多的边界条件while(left<right)orwhile(left<=right)right=middle;orright=middle-1;区间的定义不同,边界处理方式不同区间......
  • Day7 Javase抽象接口以及异常的捕获和抛出
    Day7面向对象编程抽象abstract修饰抽象类,如果修饰方法就是抽象方法。抽象方法可以写方法体,然后让继承抽象类的类去重写抽象方法。java的类是单继承的,但是接口可以实现......
  • JavaLearnDay03
    转义字符引用数据类型·特点:存储一个引用(内存地址)通过引用指向内存地址中的数据值·字符串类型:关键字:String作用:存储多个字符补充内容:在Java中所有整数默认为int......
  • [NOIP2000 普及组] 计算器的改良
    [NOIP2000普及组]计算器的改良题目背景NCL是一家专门从事计算器改良与升级的实验室,最近该实验室收到了某公司所委托的一个任务:需要在该公司某型号的计算器上加上解一......
  • windows 2008 R2 断电重启进入修复模式
    windows2008R2意外断电重启进入修复模式 现在出现一个问题,就是当机房停电的时候,计算机自动进入到修复模式,当人不在机房的时候,容易造成服务器无法访问,我相信正常启动应......
  • 02 uniapp/微信小程序 项目day02
    一.分类1.1页面布局首先创建cate的分支定义基本结构,因为是两个需要滚动的区域,所以这里要用到组件scroll这个组件如果是yscroll那就要固定高度,xscroll那就要固定......
  • 初入程序员的世界day1--内容总结
    一:程序员笔记(文档记录)软件--typora(markdown文本编辑器)软件的下载与安装​目前非常火爆的文本编辑器,可以很方便的添加重点标记框比如```python就可以框出一个醒目......