“卓见杯”郑州轻工业大学第十五届程序设计大赛暨河南省高校邀请赛

“卓见杯”郑州轻工业大学第十五届程序设计大赛暨河南省高校邀请赛

3033: 最大的数

由于需要对1e9取模,所以理论上应该只能走9步,我们应该从最大的数开始搜索,递归9层return。
#include<bits/stdc++.h>
using namespace std;
 
typedef pair<int,int> PII;
 
const int N = 200010;
vector<PII> g[N];
int a[N],b[N];
int n;
 
int res=0;
 
void dfs(int u,int sum,int d)
{
    res=max(res,sum);
    if(d>=9) return ;
    for(auto &j:g[u])
        dfs(j.first,sum*10+j.second,d+1);   
}
 
 
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
    for(int i=1;i<=n;i++) g[i].push_back({a[i],b[i]});
     
    int mx=0;
    for(int i=1;i<=n;i++) if(b[i]>mx) mx=b[i];
     
    for(int i=1;i<=n;i++)
        if(b[i]==mx)
            dfs(i,0,0);
     
    cout<<res;
     
    return 0;
}

3036: 莫比乌斯最大值isUsefulAlgorithm

我们对于a数组里面所有数字进行分解,时间复杂度( n n n\sqrt{n} nn ),再对b数组中的所有数字进行分解,判断每个因数是否是否可以与a的因数组成答案
#include <bits/stdc++.h>
using namespace std;
 
typedef long long LL;
const int N=100010;
 
int a[N],b[N],d[N];
 
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
     
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++)
    {
        int x=b[i];
        for(int j=1;j<=x/j;j++)
            if(x%j==0)
            {
                d[j]=max(d[j],x);
                d[x/j]=max(d[x/j],x);
            }
    }
    LL ans=-1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=a[i]/j;j++)
            if(a[i]%j==0 && d[j])
            {
                ans=max(ans,(LL)a[i]*d[j]*j);
                ans=max(ans,(LL)a[i]*d[a[i]/j]*a[i]/j);
            }
             
    cout<<ans;
 
    return 0;
}

3038: what’s 莫比乌斯最大值

我们需要小心这样的数据
4
what's modui
what's moduij
moduij
modui
2
当出现多个答案之后我们应该优先处理最长的字符串。
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    map<string,bool> st;
    set<pair<string,int>> b;
     
    int res=0;
    int n;cin>>n;
    for(int i=1; i<=n; i++)
    {
        string s;cin>>s;
        if(s=="what's") 
        {
            cin>>s;
            b.insert({s,s.size()});
        }
        else
        {
            string pos="-1";
            for(auto &p:b)
            {
                string k=p.first;
                int j=p.second;
                string str=s.substr(0,j);
                if(!st[k] && str==k) 
                    pos=k;
            }
            if(pos!="-1") 
            {
                res++;
                st[pos]=true;
            }
        }
    }
    cout<<res;
    
    return 0;
}

3041: Alice and Bob

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

int main()
{
	string a,b,c,d;cin>>a>>b>>c>>d;
	
	bool ok1=0,ok2=0;
	if(a.size()>=6 || b.size()>=6) ok1=1;
	if(c.size()>=6 || d.size()>=6) ok2=1;
	
	LL aa,bb,cc,dd,sum1,sum2;
	if(!ok1)
	{
		aa=stoll(a);
		bb=stoll(b);
		sum1=aa*aa+bb*bb;
		if(sum1>1000000) ok1=1;
	}
	if(!ok2)
	{
		cc=stoll(c);
		dd=stoll(d);
		sum2=cc*cc+dd*dd;
		if(sum2>1000000) ok2=1;
	}
	if(ok1 && ok2) cout<<"Draw";
	else if(ok1) cout<<"Bob";
	else if(ok2) cout<<"Alice";
	else if(sum1>sum2) cout<<"Bob";
	else if(sum1<sum2) cout<<"Alice";
	else if(sum1==sum2) cout<<"Draw";
	
	return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wa_Automata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值