20250507训练赛补题

发布于:2025-05-15 ⋅ 阅读:(12) ⋅ 点赞:(0)

A.chmod

题目链接:Problem - A - Codeforces


题目大意:数字0-7中化为二进制,当当前位置为0的时候用 ‘ - ’ 代替,不然的话三位数分别用rwx进行替代。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+1;
#define int long long
int a[N];
string s;
string ch[]={"---","--x","-w-","-wx","r--","r-x","rw-","rwx"};//每个数字对应的串直接存起来
string s1;
void solve()
{
	
	cin >> s;
	for(int i=0; i<s.size(); i++)
		s1+=ch[(s[i]-'0')];
	cout << s1 << endl;
	s1.clear(),s.clear();
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	t=1;
	cin >> t;
	while(t--) solve(); 
}

F.Try a Try,AC is OK

由于要使两个值的&运算取最大值,通过样例不难发现,自己与自己做&运算还是自己,那么不妨直接让序列中最大的那个元素和自己做&运算,这个时候就是最大的情况了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5+1;
#define int long long
int a[N]; 
void solve()
{
	int n;
	cin >> n;
	for(int i=1; i<=n; i++) cin >> a[i];
	sort(a+1,a+1+n);
	cout << a[n] << endl; 
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	t=1;
	cin >> t;
	while(t--) solve(); 
}

G.Disappear Number

题目链接:Problem - G - Codeforces

题目意思非常的清楚。具体步骤在代码注释中进行详细指出

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 101;
#define int long long
typedef long long ll;
//int a[N];
string s;
int n;
int a[N];
vector<int> v;
void solve()
{	//for(auto i:v) cout << i << ' ';
	//v.clear();
	a[1]=1;a[2]=19;
	for(int i=3; i<=18; i++)
		a[i]=a[i-1]*9+pow(10,i-1);//推一下规律
	//for(int i=1; i<=18; i++) cout << a[i] << ' ';
	ll k;
	string m;
	cin>>m>>k;
	ll sum[22];
	ll sum1=0;
	for(ll i=0;i<m.size();i++)
	{
		sum[i]=m[i]-'0';
		sum1*=10;
		sum1+=sum[i];
	}//将字符串转换为数字形式
	ll len=log10(sum1)+1;
	ll k1=0;
	ll h=-1;
	for(ll i=0;i<m.size();i++)
	{
		if(sum[i]==k)//对这个数字进行查找,如果找到目标的数字,将这个数字的位置记录下来
		h=i;
	}
	if(h!=-1)//如果序列里有这个数的话
	{
		for(ll i=h+1;i<m.size();i++)//从这个地方之后的值给截下来
		{
			k1*=10;
			k1+=sum[i];
		}
		for(ll i=0;i<=h;i++)//对数字之前的数位进行处理
		{
			if(sum[i]>k)
			k1+=a[len]-(10-sum[i])*a[len-1];//对于每一位根据前边推的规律直接加上对应的个数
			else if(sum[i]<=k)
			k1+=a[len-1]*sum[i];
			len--;
		}
	}
	else if(h==-1)//如果序列中没有目标数字,就直接对整个数字进行处理,和前面的一样
	{
			for(ll i=0;i<m.size();i++)
		{
			if(sum[i]>k)
			k1+=a[len]-(10-sum[i])*a[len-1];
			else if(sum[i]<=k)
			k1+=a[len-1]*sum[i];
			len--;
		}
	}
	cout<<sum1-k1+1<<endl;
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	t=1;
	int t;
	cin >> t;
	while(t--) solve(); 
}
	

M.Window Decoration

题目链接:Problem - M - Codeforces



题目大意:在100*100的大窗口里有若干个如图的小菱形,但是有可能重叠。想让求出所有菱形覆盖的面积是多少。

思路:由图可见:重叠的可能只有两种:1/4小正方形或者一整个小正方形。那么我们用一个二维数组来存每个小菱形的中心,对于每个小菱形对它的四个角进行遍历,如果他的四个角是其他菱形的中心,那么就会有1/4是重合的。如果此时的小菱形中心已经被标记过,那就说明两个小菱形是完全重合的,直接跳过就行了。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 101;
#define int long long
int n;
int a[N][N];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
void solve()
{
	int x,y;
	double sum=n*2;
	for(int i=1; i<=n; i++)
	{
		cin >> x >> y;
		if(a[x][y]) 
		{
			sum-=2;
			continue;
		}
		a[x][y]=1;
		for(int i=0; i<4; i++)
		{
			int tx=x+dx[i];
			int ty=y+dy[i];
			if(a[tx][ty]) sum-=0.5;
		}
	}
	cout << fixed << setprecision(10) << sum << endl;
}
signed main()
{
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//	t=1;
	cin >> n;
	solve(); 
}


网站公告

今日签到

点亮在社区的每一天
去签到