A. Number Transformation
题目
分析
x,y,将y转换为x与a个b相乘的结果,找出a,b。
暴力模拟,找到任意一组直接输出。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int x,y;
cin>>x>>y;
if(y%x!=0)
{
cout<<"0 0"<<endl;
continue;
}
int tt=y/x;
int i,j;
int f=0;
for(i=1;i<=100;i++)
{
for(j=1;j<=100;j++)
{
int ii=i;
int tmp=1;
while(ii)
{
ii--;
tmp*=j;
if(tmp==tt)
{
f=1;
break;
}
}
if(f) break;
}
if(f) break;
}
cout<<i<<" "<<j<<endl;
}
return 0;
}
B. Dictionary
题目
分析
一个字符串包含两个字母,根据字典序排序,求这个字符串的序号。
预处理所有的组合,输出序号。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[30][30];
int main()
{
int cnt=0;
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
if(i==j) continue;
cnt++;
a[i][j]=cnt;
}
}
int t;
// cout<<a[1][2];
cin>>t;
while(t--)
{
string s;
cin>>s;
cout<<a[s[0]-96][s[1]-96]<<endl;
}
return 0;
}
C. Infinite Replacement
题目
分析
两个字符串s,t,s全由a组成,s中的a可以被t换掉,换掉之后如果还出现a还可以接着换,如果换掉的结果是无数种输出-1,否则输出种数。
分类讨论,如果t中有a并且不是只是这个a即可一直换,就是无数种。
如果t就是一个a就是1种,否则对于每个s中的a都有换和不换两种可能,即(k表示s的长度)
注意:种数很大需要开long long,并且直接用pow函数输出结果和ans=pow(2,k)结果不同!直接输出科学计数进行了约等!
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=4e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int q;
cin>>q;
while(q--)
{
string s,t;
cin>>s>>t;
int cnt=0;
for(int i=0;i<t.size();i++)
{
if(t[i]=='a') cnt++;
}
if(cnt==1&&t.size()==1)
{
cout<<"1"<<endl;
continue;
}
if(cnt>0)
{
cout<<"-1"<<endl;
continue;
}
ll ans=pow(2,s.size());
cout<<ans<<endl;
}
return 0;
}
D. A-B-C Sort
题目
分析
给出数组a,每次将a的最后一个元素插入b的中间得到数组b,再将数组b的中间元素取出,得到数组c,判断数组c是否能是一个升序序列。
本来想着这样取会很像一颗树,但是找不出哪个数组分别代表那种遍历。结果朋友直接敲暴力过了。
只需要判断每次插入b的时候插入的这个数是否比中间的数小,小的话继续判断,大的话就肯定不可以了。因为每次插c的时候都是从b的中间,这样b数组从两边往中间就会越来越小(真的很像一颗什么树)
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e6+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn],b[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
if(n<=2)
{
cout<<"YES"<<endl;
continue;
}
int f=1;
int i;
int x=a[n],y=a[n-1],z=0;
for(i=n-2;i>0;i--)
{
if(f)
{
if(a[i]>x||a[i]>y) break;
else {
z=y;
y=a[i];
}
f=0;
}
else {
if(x<=z)
{
if(a[i]<=y||a[i]<=x)
{
x=a[i];
}
else break;
}
else {
if(a[i]<=z||a[i]<=y)
{
x=y;
y=a[i];
}
else break;
}
f=1;
}
}
if(i==0) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
E. Breaking the Wall
题目
分析
懒得写了,贴上朋友的题解,这个很详细!
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn];
int main()
{
int n;
cin>>n;
int mini=-1;
int mmin=INT_MAX;
int mmin1=INT_MAX;
int mmin2=INT_MAX;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(i>0)
{
if(a[i]>=2*a[i-1]) mmin=min(mmin,(a[i]+1)/2);
else if(a[i-1]>=2*a[i]) mmin=min(mmin,(a[i-1]+1)/2);
else mmin=min(mmin,(a[i]+a[i-1]+2)/3);
}
if(i>1&&a[i-1]>min(a[i-2],a[i]))
{
int b=max(a[i-2],a[i]);
int s=min(a[i-2],a[i]);
mmin=min(mmin,s+((b-s)+1)/2);
}
if(i==1)
{
mmin1=max(a[0],a[1]);
mmin2=min(a[0],a[1]);
}
else if(i>1)
{
if(mmin2>a[i]&&mmin1>a[i])
{
mmin1=mmin2;
mmin2=a[i];
}
else if(mmin1>a[i]) mmin1=a[i];
}
}
mmin=min(mmin,(mmin1+1)/2+(mmin2+1)/2);
cout<<mmin<<endl;
return 0;
}
F. Desktop Rearrangement
题目
分析
时间很大3s,直接暴力模拟就行
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e4+10;
const ll mod=1e9+7;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
char a[maxn][maxn];
int n,m,q;
int sum,cnt[maxn];
int main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='*')
{
sum++;
cnt[j]++;
}
}
}
while(q--)
{
int x,y;
cin>>x>>y;
if(a[x][y]=='*')
{
sum--;
cnt[y]--;
}
if(a[x][y]=='*')
{
a[x][y]='.';
}
else a[x][y]='*';
if(a[x][y]=='*')
{
cnt[y]++;
sum++;
}
int tmp=sum/n;
int r=sum%n;
int t=0;
for(int j=1;j<=tmp;j++)
{
t+=cnt[j];
}
for(int i=1;i<=r;i++)
{
if(a[i][tmp+1]=='*') t++;
}
cout<<sum-t<<endl;
}
return 0;
}