CSDN竞赛第38期题解

CSDN竞赛第38期题解

1、题目名称:代写匿名信

小Q想要匿名举报XX领导不务正业! 小Q害怕别人认出他的字迹。 他选择从报纸上剪裁下来英文字母组成自己的举报信。
现在小Q找来了报纸,和自己的举报信的Txt, 你能帮他确定一下是否能够完成匿名信吗?

string s,t;
getline(cin,s);
getline(cin,t);
unordered_map<char,int>mp;
for(int i=0;i<s.size();i++) mp[s[i]]++;
int ok =1;
for(int i=0;i<t.size();i++){
    
    
if(!mp.count(t[i])){
    
    
ok=0;break;
}
}
puts(ok?"Yes":"No");
return 0;

2、题目名称:寻因找祖

寻找因子个数为n的最小整数x.

def __init__(self) -> None:
self.a=[2,3,5,7,11,13,17,19,23,29,31]
self.res=1
def fun(self,d,now,x,y):
if x==1:
self.res=min(self.res,now)
return
if d>=11:
return
for i in range(1,y+1):
if i*i>x:
break
if x%i>0:
continue
if i>1:
self.fun(d+1,now*(self.a[d]**(i-1)),x//i,i)
tmp = x//i
if i<tmp:
self.fun(d+1,now*(self.a[d]**(tmp-1)),x//tmp,tmp)
def solution(self, n):
result = None
# TODO: 请在此编写代码
self.res= 10**777
self.fun(0,1,n,n)
return self.res

3、题目名称:小Q新式棋盘

已知棋盘大小为n*n。 每个位置都有自己的权值q。 该棋盘中有多少对行权值和小于列权值和。

int n ;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
    
    
cin>>a[i][j];
pre[i] = pre[i]+a[i][j];
b[j]=b[j]+a[i][j];
}
int ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
    
    
if(pre[i]<b[j]) ans++;
}
cout<<ans;
return 0;

4、题目名称:拯救公主

在Flower Kingdom里,住着一位美丽的公主Ana,有一天Ana得了一种怪病,神医告知国王,在遥远的幽谷中有一种药
能治愈Ana, 但是神医只有一份不完整的地图,地图的描述如下:
该地图的共有3行,第一行有m列,m为奇数,第二行有m+1列,第三行有m+2列;
每一行用一个字符串表示,只有【两种字符】;‘.'表示草地,可以从它上面通过,‘’表示岩石,每一行最多一个‘’;
入口在左上角,由于在对角线方向上,因此即使对角线两边都有岩石,但是缝隙较大,人可以通过,故人可以向八个方向
行走;
真实地图是由该地图的【每一行无限循环】得到的,这种神奇的药草就生长在第x行第y列的草地上,药草可能会在岩石上;
国王决定派遣勇敢的骑士David前去寻找拯救公主的解药; 现在聪明的你是否知道David能否找到该药?

ll ksm(ll a,ll n,ll m=mod){
    
    
ll ans=1;
while(n){
    
    
if(n&1) ans=ans*a%m;
a=a*a%m;
n>>=1;
}
return ans;
}
struct BIT{
    
    
#define lowbit(x) x&(-x)
#define il inline
ll s[N];
int n;
il void upd(int x,int v){
    
    
while(x<=n){
    
    
s[x]+=v;x+=lowbit(x);
}return;
}
il ll que(int x){
    
    
ll ans=0;
while(x){
    
    
ans+=s[x];x-=lowbit(x);
}return ans;
}
}T;
int main() {
    
    
int t;
cin >> t;
while (t--) {
    
    
int cnt, myX, myY;
cin >> cnt >> myX >> myY;
int a, b, d;
for (int pointer = 0; pointer < cnt; pointer++) {
    
    
char ch;
cin >> ch;
if (ch == '*') a = pointer;
}
for (int pointer = 0; pointer < cnt + 1; pointer++) {
    
    
char ch;
cin >> ch;
if (ch == '*') b = pointer;
}
for (int pointer = 0; pointer < cnt + 2; pointer++) {
    
    
char ch;
cin >> ch;
if (ch == '*') d = pointer;
}
int p = myY % (cnt+myX-1);
if (myX == 1 && p == a+1) {
    
    
puts("NO");
continue;
}
if (myX == 2 && p == b+1) {
    
    
puts("NO");
continue;
}
if (myX == 3 && p == d+1) {
    
    
puts("NO");
continue;
}
int flag = 1;
for (int pointer = 1; pointer < myY; pointer++) {
    
    
if (pointer % cnt == a && pointer % (cnt+1) == b && pointer % (cnt+2) == d) {
    
    
flag = 0;
break;
}
if (pointer % cnt == 0 && pointer % (cnt+1) == 0 && pointer % (cnt+2) == 0) break;
}
if (flag) puts("YES");
else puts("NO");
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/129712538