题目 | 难度 | 知识点 |
---|---|---|
A 小红的签到题 | ★ | 签到 |
B 小红的模拟题 | ★ | 思维 |
C 小红的方神题 | ★ | 思维 |
D 小红的数学题 | ★★ | 思维 |
E 小红的ds题 | ★ | 构造 |
F 小红的小苯题 | ★★ | 构造 |
F题不会,其他的D有点意思。
小红的签到题
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],n;
int main(void)
{
cin>>n;
cout<<"z_";
for(int i=1;i<=n-2;i++) cout<<"z";
return 0;
}
小红的模拟题
#include<bits/stdc++.h>
using namespace std;
const int N=1e3*3+10;
typedef long long int LL;
string s[N],ans;
int n,m,st[N][N];
int dx[4]={0,1};
int dy[4]={1,0};
string ss="DS";
void dfs(int x,int y,string temp)
{
st[x][y]=1;
if(ans.size()) return;
if(x==(n-1) && y==(m-1))
{
ans=temp;
return;
}
for(int i=0;i<2;i++)
{
int tempx=x+dx[i],tempy=y+dy[i];
if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;
if(st[tempx][tempy]) continue;
if(s[tempx][tempy]=='#') continue;
dfs(tempx,tempy,temp+ss[i]);
}
}
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
dfs(0,0,"");
cout<<ans;
return 0;
}
不一定要dfs,其实有两种情况,必有一种情况满足。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
string s[N],ans1,ans2;
int n,m,flag;
int main(void)
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=1;i<=m-1;i++) ans1+="D";
for(int i=1;i<=n-1;i++) ans1+="S";
for(int i=1;i<=n-1;i++) ans2+="S";
for(int i=1;i<=m-1;i++) ans2+="D";
int x=0,y=0;
for(int i=0;i<(int)ans1.size();i++)
{
if(ans1[i]=='D') y++;
else x++;
if(s[x][y]=='#') flag=1;
}
if(flag) cout<<ans2;
else cout<<ans1;
return 0;
}
小红的方神题
构造规律挺好找的。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3*3+10;
typedef long long int LL;
int n;
int main(void)
{
cin>>n;
if(n==1 || n==2) puts("-1");
else
{
cout<<"1 ";
for(int i=n,j=1;j<=n-1;j++,i--) cout<<" "<<i;
}
return 0;
}
小红的数学题
暴力枚举可以看到,有俩根那么意味着
(x-a)(x-b)=x^2-(a+b)x+ab=0
p=a+b,q=ab;
a+b+ab=k,枚举b计算a,求出pq即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL k;
int main(void)
{
cin>>k;
for(LL i=1;i<=1e6;i++)
{
LL b=i;
if( (k-i)%(i+1)==0)
{
LL a=(k-i)/(i+1);
if(a+b>0 && a*b>0)
{
cout<<a+b<<" "<<a*b;
return 0;
}
}
}
puts("-1");
return 0;
}
小红的ds题
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],sum;
map<int,int>l,r;
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
int u=1;//u是上次层的起始点,
for(int i=2;i<=n;i++)
{
int temp=u+a[i-1],cnt=a[i];//temp是这一层的起始点
for(int j=1,p=u;j<=a[i];j++,p++)
{
if(cnt) l[p]=temp++,cnt--;
else l[p]=-1;
if(cnt) r[p]=temp++,cnt--;
else r[p]=-1;
if(cnt==0) break;
}
u=temp-a[i];
}
cout<<1<<endl;
for(int i=1;i<=sum;i++){
if(l[i]) cout<<l[i]<<" ";
else cout<<-1<<" ";
if(r[i]) cout<<r[i]<<endl;
else cout<<-1<<endl;
}
return 0;
}
小红的小苯题
#include<bits/stdc++.h>
using namespace std;
const int N=510;
int a[N][N],flag;
int main(void)
{
int n,m; cin>>n>>m;
if(n>m) swap(n,m),flag=1;
for(int i=1;i<=n;i++) a[i][i]=i;
for(int i=n+1;i<m;i++) a[n][i]=i;
for(int i=1,j=m+1;i<=n-1;i++,j++) a[i][m]=i^j;
int s=m;
for(int i=1;i<=n-1;i++) s^=a[i][m];
a[n][m]=s;
int temp=0;
for(int i=1;i<=m;i++) temp^=a[n][i];
if( temp== (n+m) )
{
if(!flag){
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) cout<<a[i][j]<<" ";
puts("");
}
}else{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++) cout<<a[j][i]<<" ";
cout<<endl;
}
}
}else puts("-1");
return 0;
}
/*
1 1^5
2 1^6
3 x 7
4
*/