Codeforces Round 161 (Rated for Div. 2)(Codeforces日记)

A. Tricky Template

题目大意:

先给你三个长度均为n的字符串A B C,再让你判断是否存在一个模板串s,使A和B与其匹配,C不匹配。

匹配规则如下:

如果si是大写字母,则其他字符串的第i个字符必须与其不同才能匹配

如果si是小写字母,则其他字符串的第i个字符必须与其相同才能匹配

解题思路:

直接判断有无Ai不等于Ci且Bi不等于Ci即可

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100];
void solve()
{
	int n,flag=0;
	string x,y,z;
	cin>>n;
	cin>>x>>y>>z;
	for(int i=0;i<n;i++)
	{
		if(x[i]!=z[i]&&y[i]!=z[i])
		flag=1;
	}
	if(flag){
	cout<<"YES"<<endl;
	}else{
	cout<<"NO"<<endl;
	}
	return ;
}
signed main()
{
	IOS
	int t=1;
	cin>>t;
	while(t--)
	solve();
    return 0;
}

B. Forming Triangles

题目大意:

给你n根木棍,长度均为2的ai次方,判断能组成三角形的方案数

解题思路:

看似很难,但是因为长度均为2的ai次方,所以问题简化了,对于每种长度,只需要判断比起小的长度和跟其一样的就可以了,利用组合数知识,从0(对应长度为2的0次方)遍历到输入的最大值即可,每次遍历判断当前长度的木棍数量是否大于等于2,等于2则:加上比当前长度小的长度个数大于2:则分两步相加,1.当前长度数量n选3。2.当前长度数量n选2再乘上比其小的长度的数量

最后可发现两种情况可合并,即大于等于2情况,1.当前长度数量n选3。2.当前长度数量n选2再乘上比其小的长度的数量即可

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[300100],b[300100];
void solve()
{
	int n,sum=0,num=0,x,y,ans=0;
	cin>>n;
	memset(b,0,sizeof(b));
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		b[a[i]]++;
		sum=max(sum,a[i]);
	}
	for(int i=0;i<=sum;i++){
		ans+=b[i];
		if(b[i]>=2){
	    num+=b[i]*(b[i]-1)*(b[i]-2)/6+b[i]*(b[i]-1)/2*(ans-b[i]);//核心代码
		}
	}
	cout<<num<<endl;
	return ;
}
signed main()
{
	IOS
	int t=1;
	cin>>t;
	while(t--)
	solve();
    return 0;
}

C. Closest Cities

题目大意:

给你n个城市的位置,从小到大给出(即升序),给你m个询问,每次问两个城市x,y,(大小不定),问从x移动到y需要多少金币。移动规则如下:

1.前往任何其他城市,消耗|ax-ay|的金币

2.从当前城市移动到离自己最近的一个城市,消耗1金币

解题思路:

定义两个新数组A和B,分别从正反两个方向遍历原数组,每次判断进行1还是2操作,并将操作之后的消耗金币数累积到当前位置,最后按询问的x和y的大小,判断是用A数组相减还是B数组相减即可。

AC代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl "\n";
int a[200100],sum[200100],num[200100];
void solve()
{
	int n,m,x,y;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sum[1]=0;
	sum[2]=1;
	for(int i=2;i<=n;i++){
		if((a[i+1]-a[i])<(a[i]-a[i-1])){
			sum[i+1]=sum[i]+1;
		}else{
			sum[i+1]=sum[i]+a[i+1]-a[i];
		}
	}
	num[n]=0;
	num[n-1]=1;
	for(int i=n-1;i>0;i--){
		if((a[i+1]-a[i])>(a[i]-a[i-1])){
			num[i-1]=num[i]+1;
		}else{
			num[i-1]=num[i]+a[i]-a[i-1];
		}
	}
	cin>>m;
	while(m--){
		cin>>x>>y;
		if(x<y){
			cout<<sum[y]-sum[x]<<endl;
		}else{
			cout<<num[y]-num[x]<<endl;
		}
	}
	return ;
}
signed main()
{
	IOS
	int t=1;
	cin>>t;
	while(t--)
	solve();
    return 0;
}

总结:

第一道签到,第二道思维加一点数学知识,第三道贪心+前缀和,第四道没来得及看,因为第二道当时把大于当前长度1个层次的也算进去了,一直wa,后来发现算进去是不成立的,导致wa了9发,下次谨记。这次的第三题相对之前简单了,希望下次还能写出第三题并保持,寒假结束能稳定3题并冲4题

相关推荐
weixin_432702262 分钟前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习5 分钟前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7155 分钟前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习8 分钟前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
武子康20 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
passer__jw7671 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾1 小时前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序1 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio