0
点赞
收藏
分享

微信扫一扫

【CF #786 Div3】A-F

小_北_爸 2022-05-06 阅读 68
c++算法

A. Number Transformation

题目

分析

x,y,将y转换为x与a个b相乘的结果,找出a,b。

暴力模拟,找到任意一组直接输出。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int x,y;
		cin>>x>>y;
		if(y%x!=0)
		{
			cout<<"0 0"<<endl;
			continue;
		}
		int tt=y/x;
		int i,j;
		int f=0;
		for(i=1;i<=100;i++)
		{
			for(j=1;j<=100;j++)
			{
				int ii=i;
				int tmp=1;
				while(ii)
				{
					ii--;
					tmp*=j;
					if(tmp==tt) 
					{
						f=1;
						break;
					}
				}
				if(f) break;
			}
			if(f) break;
		}
		cout<<i<<" "<<j<<endl;
	}
	return 0;
}

B. Dictionary

题目

分析

一个字符串包含两个字母,根据字典序排序,求这个字符串的序号。

预处理所有的组合,输出序号。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[30][30];

int main()
{
	int cnt=0;
	for(int i=1;i<=26;i++)
	{
		for(int j=1;j<=26;j++)
		{
			if(i==j) continue;
			cnt++;
			a[i][j]=cnt;
		}
	}
	int t;
//	cout<<a[1][2];
	cin>>t;
	while(t--)
	{
		string s;
		cin>>s;
		cout<<a[s[0]-96][s[1]-96]<<endl;
	}
	return 0;
}

C. Infinite Replacement

题目

分析

两个字符串s,t,s全由a组成,s中的a可以被t换掉,换掉之后如果还出现a还可以接着换,如果换掉的结果是无数种输出-1,否则输出种数。

分类讨论,如果t中有a并且不是只是这个a即可一直换,就是无数种。

如果t就是一个a就是1种,否则对于每个s中的a都有换和不换两种可能,即2^{k}(k表示s的长度)

注意:种数很大需要开long long,并且直接用pow函数输出结果和ans=pow(2,k)结果不同!直接输出科学计数进行了约等!

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);

int main()
{
	int q;
	cin>>q;
	while(q--)
	{
		string s,t;
		cin>>s>>t;
		int cnt=0;
		for(int i=0;i<t.size();i++)
		{
			if(t[i]=='a') cnt++;
		}
		if(cnt==1&&t.size()==1)
		{
			cout<<"1"<<endl;
			continue;
		}
		if(cnt>0)
		{
			cout<<"-1"<<endl;
			continue;
		}
		ll ans=pow(2,s.size());
		cout<<ans<<endl;
	}
	return 0;
}

D. A-B-C Sort

题目

分析

给出数组a,每次将a的最后一个元素插入b的中间得到数组b,再将数组b的中间元素取出,得到数组c,判断数组c是否能是一个升序序列。

本来想着这样取会很像一颗树,但是找不出哪个数组分别代表那种遍历。结果朋友直接敲暴力过了。

只需要判断每次插入b的时候插入的这个数是否比中间的数小,小的话继续判断,大的话就肯定不可以了。因为每次插c的时候都是从b的中间,这样b数组从两边往中间就会越来越小(真的很像一颗什么树)

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e6+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn],b[maxn];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
		}
		if(n<=2)
		{
			cout<<"YES"<<endl;
			continue;
		}
		int f=1;
		int i;
		int x=a[n],y=a[n-1],z=0;
		for(i=n-2;i>0;i--)
		{
			if(f)
			{
				if(a[i]>x||a[i]>y) break;
				else {
					z=y;
					y=a[i];
				}
				f=0;
			}
			else {
				if(x<=z)
				{
					if(a[i]<=y||a[i]<=x)
					{
						x=a[i];
					}
					else break;
				}
				else {
					if(a[i]<=z||a[i]<=y)
					{
						x=y;
						y=a[i];
					}
					else break;
				}
				f=1;
			}
		}
		if(i==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

E. Breaking the Wall

题目

分析

懒得写了,贴上朋友的题解,这个很详细!

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn];

int main()
{
	int n;
	cin>>n;	
	int mini=-1;
	int mmin=INT_MAX;
	int mmin1=INT_MAX;
	int mmin2=INT_MAX;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		if(i>0)
		{ 
			if(a[i]>=2*a[i-1]) mmin=min(mmin,(a[i]+1)/2);
			else if(a[i-1]>=2*a[i]) mmin=min(mmin,(a[i-1]+1)/2);
			else mmin=min(mmin,(a[i]+a[i-1]+2)/3);
    	}
		if(i>1&&a[i-1]>min(a[i-2],a[i]))
		{
			int b=max(a[i-2],a[i]);
			int s=min(a[i-2],a[i]);
			mmin=min(mmin,s+((b-s)+1)/2);
		}
		if(i==1)
		{ 
			mmin1=max(a[0],a[1]);
			mmin2=min(a[0],a[1]);
		}
		else if(i>1)
		{
			if(mmin2>a[i]&&mmin1>a[i])
			{
				mmin1=mmin2;
				mmin2=a[i];
			}
			else if(mmin1>a[i]) mmin1=a[i];
		}
	}
	mmin=min(mmin,(mmin1+1)/2+(mmin2+1)/2);
	cout<<mmin<<endl;
	return 0;
}

F. Desktop Rearrangement

题目

分析

时间很大3s,直接暴力模拟就行

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
char a[maxn][maxn];
int n,m,q;
int sum,cnt[maxn];

int main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
			if(a[i][j]=='*')
			{
				sum++;
				cnt[j]++;
			}
		}
	}
	while(q--)
	{
		int x,y;
		cin>>x>>y;
		if(a[x][y]=='*')
		{
			sum--;
			cnt[y]--;
		}
		if(a[x][y]=='*')
		{
			a[x][y]='.';
		}
		else a[x][y]='*';
		if(a[x][y]=='*')
		{
			cnt[y]++;
			sum++;
		}
		int tmp=sum/n;
		int r=sum%n;
		int t=0;
		for(int j=1;j<=tmp;j++)
		{
			t+=cnt[j];
		}
		for(int i=1;i<=r;i++)
		{
			if(a[i][tmp+1]=='*') t++;
		}
		cout<<sum-t<<endl;
	}
	return 0;
}
举报

相关推荐

0 条评论