A.chmod
题目大意:数字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
题目意思非常的清楚。具体步骤在代码注释中进行详细指出
代码:
#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
题目大意:在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();
}