Acwing. 第 118 场周赛

发布时间 2023-08-27 19:18:54作者: du463

Acwing. 第 118 场周赛

比赛链接
这几天开学了,一直在宿舍歇着来着,从下周一开始就要开始加训了!!!

A题循环串:

给定两个整数 n,a,请你用前 a个小写字母为循环节,构成一个无限长的循环字符串,然后输出该字符串的前 n个字符。
例如,当 a=2时,循环字符串为 ababab...,当 a=3时,循环字符串为 abcabcabc...。

A思路:

这就是一个比较简单的模拟,因为一开始循环是从一开始的导致在进行取余的过程中出现了一个问题.,但是从0开始就可以避免这个问题.

A代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){
	int n,a;
	cin>>n>>a;
	for(int i=0;i<n;i++){
		cout<<(char)('a'+i%a);
	}
	cout<<endl;
	
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;

}

B题操作轮数

给定两个正整数 a,b(a>b)。
对两数执行以下操作,在每一轮操作中:
令较大数变为较大数减较小数之差,令较小数保持不变。(注意,如果两数相等,则任意指定其中一数为较大数即可。)
当两数之中至少有一个数变为 0时,操作停止。
请你计算,一共需要进行多少轮操作。

B思路:

一开始以为模拟就可以过去,但是还是超时了,后来想到其实一次可以处理多次的数据,因为如果a减去一个b还是a大的话,我们可以计算a当中有多少个b,可以一次性把较小的b处理干净.

B代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void solve(){
	ll a,b;
	cin>>a>>b;
	ll x,y;
	ll ans=0;

	// while(a!=0&&b!=0){
	// 	maxn=max(a,b);
	// 	minn=min(a,b);
	// 	maxn-=minn;
	// 	a=maxn;
	// 	b=minn;
	// 	ans++;
		
	// }//简单的模拟出现了超时的情况
	while(a!=0&&b!=0){
		x=a,y=b;
		a=max(x,y);
		b=min(x,y);
		ll cnt=a/b;//因为其实一次可以处理多次、
		ans+=cnt;
		a%=b;//b是较小的那个数字。
	}
	cout<<ans<<endl;
	
	
}
int main(){
	int t;
	// cin>>t;
	t=1;

	while(t--){
		solve();
	}
	return 0;

}

C题移动棋子

在一个无限大的二维平面中有一颗棋子。
初始时,棋子位于点 (x0,y0)。
现在,我们希望将棋子移动至点 (x1,y1)。
每次移动时,你需要首先选择一个与棋子距离恰好为 r的点,然后令棋子以该点为旋转中心旋转任角度,使得棋子到达适当的位置。
请计算,为了使棋子到达最终目的地,至少需要进行多少次移动。

C思路:

根据题意我们可以很容易想到棋子的运动轨迹是一个圆,这里我们就只需要考虑圆的直径为2r即可,也就是说只要两点之间的距离小于2r,那么我们都可以在两点外找到第三个点,使得这两个点在同一个圆上。

C代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;

int main()
{
    ll r, x, y, x1, y1;
    cin >> r >> x >> y >> x1 >> y1;

    double d = sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
    double t = d / (2 * r);

    cout << ceil(t) << endl;
    return 0;
}

这次的比较简单,只要想到思路其实就不难写出来,下次争取全做出来!!!