萌新联赛(六)

郑州大学第六场萌新联赛,题目有点难,有兴趣可以写一下这里

C-报数_

找规律,结果都等于1

复制代码
cout<<"1"<<endl;

G-找不同

直接判断每个字符是否相等

复制代码
void solve()
{
	int n; cin>>n;
	string a; cin>>a;
	bool ok=false;
	for(int i=0;i<a.size();i++){
	for(int j=i+1;j<a.size();j++){
            if(a[i]!=a[j])
            {
                cout<<i<<" "<<j<<endl;
                ok=true;
                break;
            }	
        }
		if(ok)
		break;
	}
	if(!ok)
	cout<<"-1"<<endl;
	//cout<<fixed<<setprecision(k);
}

J-空调_

这道题我们需要考虑的东西有很多,模式从开头到结束,再从结束到开头,温度到开头和结束的时候,再按温度也不会变,感觉很复杂,但是如果仔细查看可以发现其中规律。首先我们要把模式和温度差值算出来,模式就是m-1,温度就是abs(t-26)。如果n<两者相加,那么肯定说谎。接下来在判断>=内的情况,c=除去需要的还剩下的步骤。我们可以把他们放在温度和模式上,如果c%2==0说明我们可以在温度上加一度再减一度,结果不变;如果t等于左边界或者右边界,那么可以一直加或者一直减,温度不会变;如果温度与边界的两倍差值小于c那么可以先走到边界,再消耗多余的步骤,最后再返回原来的位置,结果依旧不会变;这样就可能会实现。最后如果c小于模式的总数;或者模式的总数为偶数(c=2x+ ky,c大于模式的总数,我们需要若干个2和若干个k,2*x是偶数,如果k是偶数,那么c怎么都不可能是奇数,而k是奇数,则c无论是什么都能实现)则说明说谎,其余情况的都有可能实现。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=1e6+6;
const int mod=1e9+7; 
//ll a[N],b[N];

void solve()
{
	int l,r,k,n,t,m;
	cin>>l>>r>>k>>n>>t>>m;
	int cntm=0,cntt=0;
	cntm=m-1,cntt=llabs(t-26);
	if(n<cntm+cntt)//第一轮都不够的
	{
		cout<<"Lie"<<endl;
		return;
	}
	int c=n-cntm-cntt;
	if(c%2==0||t==l||t==r||c+cntt>=r-26+(r-t)||c+cntt>=26-l+t-l)//需要消耗的,自我能消耗完的
	{
		cout<<"Maybe"<<endl;
		return;
	}
	if(c<k||k%2==0)//剩下的怎么都不能完全消耗
	{
		cout<<"Lie"<<endl;
		return;
	}
	cout<<"Maybe"<<endl;//其余情况
	//cout<<fixed<<setprecision(k);
}
signed main()
{
	IOS
	ll PPP=1;
	cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}

D-垂直电梯_

这道题我们知道总费用为(k*m-a+b)我们要减少换乘的次数才能减少总费用,接着可以看出从a到b,分两种情况,第一种:两趟,a和b的最大公因数大于1,所以就先从a-1层坐电梯到1层,再从1层坐电梯到b-1层。第二种:a和b的最小公倍数小于等于n,所以直接到达b层。不会有第三种无解的情况,自然不用考虑"No Solution"。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=1e6+6;
const int mod=1e9+7; 
//ll a[N],b[N];
int lcm(int a,int b)
{
	return a*b/__gcd(a,b);
}
void solve()
{
	int n,m,a,b;
	cin>>n>>m>>a>>b;
	if(__gcd(a,b)>1||lcm(a,b)<=n)
	cout<<m+b-a<<endl;
	else cout<<m+b-a+m<<endl;
	//cout<<fixed<<setprecision(k);
}
signed main()
{
	IOS
	ll PPP=1;
	cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}

B-果树_

这道题我们举例可以看出,区间两端下标都为偶数或奇数,则换不换都一样,如果去见两段一个奇数一个偶数,则可以换,取最大值。接着就用最大子序列来更新最大值。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=2e5+6;
const int mod=1e9+7; 
//ll a[N],b[N];
int a[N];
vector<int> v1,v2;
void solve()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	int sum=0;
	v1.clear(),v2.clear();
	for(int i=0;i<n;i+=2) sum+=a[i];
	for(int i=0;i+1<n;i+=2)
	v1.push_back(a[i+1]-a[i]);
	for(int i=1;i+1<n;i+=2)
	v2.push_back(a[i]-a[i+1]);
	int sum1=0,sum2=0,ans1=0,ans2=0;
	for(int i=0;i<v1.size();i++)
	{
		sum1=max(v1[i],sum1+v1[i]);
		ans1=max(sum1,ans1);
	}
	for(int i=0;i<v2.size();i++)
	{
		sum2=max(v2[i],sum2+v2[i]);
		ans2=max(ans2,sum2);
	}
	cout<<sum+max({0LL,ans1,ans2})<<endl;
	//cout<<fixed<<setprecision(k);
}
signed main()
{
	IOS
	ll PPP=1;
	//cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}

L-神秘数字

每个数字的二进制一所在的位置都不一样,所以m组一共有2m个。那么我们就用二进制来算,通过二进制来算出共有m组,说明n个数转换成二进制最多有m位。然后我们看1的位置和多少来评判这个数能不能找到。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
const ll N=2e5+6;
const int mod=1e9+7; 
//ll a[N],b[N];
int n;
vector<int> ans[50];
void solve1(int m)
{
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
	{
		if(j&(1<<i))//i向左移一位与j并比较
		ans[i+1].push_back(j+1);//+1是为了方便输出
	}
}
void solve()
{
	cin>>n;
	int m=1;
	while((1<<m)<n) m++;//m向左一位,算n个数二进制最大有多少位
	solve1(m);
	cout<<m<<endl;
	for(int i=1;i<=m;i++)//遍历输出
	{
		cout<<ans[i].size();
		for(int x:ans[i])
		cout<<" "<<x;
		cout<<endl;
	}
	//cout<<fixed<<setprecision(k);
}
signed main()
{
	IOS
	ll PPP=1;
	//cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}

I-耳鸣_

由于我们知道在什么位置耳鸣,来算距离,不如把位置当做圆心,距离当做半径,来求圆的面积(即:圆上有多少个位置),把每个点的圆的位置累加就可以了。接下来就要开始每个位置遍历了,由于距离为a,那么我们圆的半径就为a,x-a~x+a为每行的距离,遍历每个x来确定y,根据两点坐标公式可以算出y方向上的距离, 而y-len~y+len为每列的距离,但后我们就开始算差分来维护行区间。

复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define pii pair<ll,ll>
#define fi first
#define se second
// const ll N=2e5+6;
// const int mod=1e9+7; 
//ll a[N],b[N];
void solve()
{
	int n,m,a,q;
	cin>>n>>m>>a>>q;
	vector<int> diff(n*m+5,0);
	for(int i=1;i<=q;i++)
	{
		int x,y;
		cin>>x>>y;
		for(int j=max(1ll,x-a);j<=min(n,x+a);j++)
		{
			int sheng=a*a-(x-j)*(x-j);//两点距离公式
			int len=(int)sqrt(sheng);
			while((len+1)*(len+1)<=sheng)
			len++;
			int l=max(1ll,y-len),r=min(m,y+len);
			//差分维护行间距
			diff[(j-1)*m+l]+=1;//前j-1行+l的位置+1;
			diff[(j-1)*m+r+1]-=1;//前j-1行+r+1的位置-1;
			//这样两下可以消掉,如果没有消掉,说明在耳鸣区间内
		}
	}
	int ans=0,k=0;
	for(int i=1;i<=n*m;i++)
	{
		k+=diff[i];
		if(k!=0)
		ans++;
	}
	cout<<ans<<endl;
	//cout<<fixed<<setprecision(k);
}
signed main()
{
	IOS
	ll PPP=1;
	//cin>>PPP;
	while(PPP--)
	solve();
	return 0;
}
相关推荐
风安•辛幸10 小时前
mac上微信最新v4以上版客户端多开教程,亲测可用
macos·微信
weixin_5316708918 小时前
Interlude起来:动作动画和文字通知哪个更适合休息提醒?Mac上有没有用桌宠做动作引导的软件?
人工智能·macos·mac·swift
FairGuard手游加固21 小时前
iOS 游戏加固技术解析:代码混淆、资源加密、内存保护与重签名检测
安全·游戏·macos·unity·ios·objective-c
思盛iOS签名上架21 小时前
iOS企业签名原理是什么?
macos·ios·cocoa
Wang's Blog1 天前
Vibe Coding一人即团队系列23: 基于Stitch/Sketch的UI原型1:1复刻工作流
人工智能·macos·ui·sketch
空の鱼2 天前
Mac 上 Node 版本管理(brew + nvm 共存方案)
macos·node.js
你疯了抱抱我2 天前
【MacOS】自己开发的APP,dock图标圆角 + 调整大小(py2app 版)
macos
k4m7v2pz2 天前
Apple Silicon Mac 上用 Wine 跑《重武器老鼠》:从下载到进游戏全流程
macos·wine·老游戏·rosetta 2·mighty rodent·腾讯软件中心
chunmiao30323 天前
苹果首款2nm芯片M6与M5 Ultra发布,Mac本地跑大模型进入新阶段
macos