1,040
社区成员
发帖
与我相关
我的任务
分享A. Burenka Plays with Fractions
题意:
给出两个分数,将其分子或分母任意乘一个数,求使两数相等的变换次数。
分析:
稍加模拟可知,最多只需要变换两次。
因为分数不便处理,令t1=a*d,t2=b*c,相乘记得开long long.
情况1:t1==t2,0次;
情况2:大数能整除小数,1次;
情况3:没有任何特殊,只能变换2次;
记得对0特殊处理。
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
#define ll long long
void _()
{
ll a,b,c,d;
cin>>a>>b>>c>>d;
ll t1=a*d,t2=b*c;
if(t1<t2) swap(t1,t2);
if(t1==t2) cout<<"0\n";
else if(t2==0) cout<<"1\n";
else if(t1%t2==0) cout<<"1\n";
else cout<<"2\n";
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>t;
while(t--) _();
return 0;
}
B. Interesting Sum
题意:给出一串数,将其分为两个区间,求两区间内最大值与最小值之差
分析:找到最大值、次大值、最小值、次小值,分割区间一定可以使一对大值与小值在一个区间。
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
#define ll long long
void _()
{
int n;
cin>>n;
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
sort(a.begin()+1,a.end());
int res=a[n]+a[n-1]-a[1]-a[2];
cout<<res<<endl;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>t;
while(t--) _();
return 0;
}
C. Corners
题意:给定一个n*m的矩阵,每次操作可以消除一个L形内所有的1,每次保证消除一个1,求操作最大值
分析:由题可知,尽可能一次操作消灭最少的1,所以尽量保证一次操作取一个1
找出取一个1,两个1和三个1的情况
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
int n,m;
char c[510][510];
#define ll long long
int st[][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{-1,1},{1,-1},{1,1}};
bool _ck(int x,int y)
{
for(int i=0;i<8;i++)
{
int xx=x+st[i][0],yy=y+st[i][1];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&c[xx][yy]=='0') return true;
}
return false;
}
void _()
{
int cnt=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>c[i][j];
if(c[i][j]=='1') cnt++;
}
}
if(cnt==n*m) {cout<<cnt-2<<endl;return;}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(c[i][j]=='0'&&_ck(i,j))
{
cout<<cnt<<endl;
return;
}
}
}
cout<<cnt-1<<endl;
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>t;
while(t--) _();
return 0;
}