暑期集训1期8

T1奇怪的乘法(模拟)

做厌了乘法计算题的贝茜,自创了一种新的乘法运算法则。在这套法则里,
AB 等于一个取自 A、一个取自 B 的所有数字对的乘积的和。比方说,12345 等
于 14 + 15 + 24 + 25 + 34 + 35 = 54。对于 2 个给定的数 A、B,你的
任务是,用新的乘法法则计算 A*B 的值。

模拟把每一个位置都取出来,然后两重循环暴力算答案

#include<bits/stdc++.h>
using namespace std;
int a1[15],b1[15],tep1,tep2;
long long ans;
string s1,s2;
int main()
{
    
    
    cin>>s1>>s2;
    for(int i=0;i<s1.size();i++)
    if(s1[i]>='0'&&s1[i]<='9')
    a1[++tep1]=s1[i]-'0';
     
    for(int i=0;i<s2.size();i++)
    if(s2[i]>='0'&&s2[i]<='9')
    b1[++tep2]=s2[i]-'0';
     
    for(int i=1;i<=tep1;i++)
    for(int j=1;j<=tep2;j++)
    ans+=a1[i]*b1[j];
    cout<<ans;
    return 0;
 } 
 

T2烤乐滋划船

在这里插入图片描述
枚举哪个点作为中间点,然后再连,看看能不能成功

#include<bits/stdc++.h>
using namespace std;
map<int ,int>q[150000];
int n,m,ans;
int main()
{
    
    
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    
    
        int x,y;cin>>x>>y;
        q[x][y]=1;
    }
    for(int i=2;i<n;i++)
    {
    
    
        if((q[1][i]&&q[i][n])||(q[n][i]&&q[i][1]))//看看是否联通
        ans++;
    }
    cout<<ans;
    return 0;
}


T3 幻想马拉松在这里插入图片描述

100pts
我们可以把这些道路当成一个图论来解决,看成一颗树。然后分情况讨论
1.如果有两个及以上的儿子没有被访问过,那么可以减2条路,就可以连起来
2.两个只有一个儿子,一条边就够,所以减1

#include<bits/stdc++.h>
#define maxn 150000
using namespace std;
int vis[maxn],n;
int head[maxn],tot,ans[maxn];
struct node
{
    
    
    int next;
    int to;
}a[maxn];
void add(int x,int y)
{
    
    
    tot++;
    a[tot].next=head[x];
    a[tot].to=y;
    head[x]=tot;
}
void dfs(int x,int fa)
{
    
    
    int tmp=0;
    for(int i=head[x];i;i=a[i].next)
    {
    
    
        if(a[i].to!=fa)
        {
    
    
            dfs(a[i].to,x);
            ans[x]+=ans[a[i].to];
            if(!vis[a[i].to])tmp++;//没有访问过的儿子
        }
    }
    if(tmp)
    {
    
    
    if(tmp>=2)ans[x]-=2,vis[x]=1;//两个
    else ans[x]--;//一个
    }
 
}
int main()
{
    
    
    cin>>n;
    for(int i=1;i<=n;i++)ans[i]=1;
    for(int i=1;i<n;i++)
    {
    
    
        int x;int y;cin>>x>>y;
        add(x,y);add(y,x);//双向边
    }
    dfs(1,0);
    cout<<ans[1];
    return 0;
}


T4烤乐滋逃亡加强版(前缀和+模拟)

在这里插入图片描述
画图可以发现,如果a[i][j]这个点可以被看到,那么i,j的n倍数,看不到,应为会被a[i][j]遮住,所以可以预处理出点
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1];二维矩阵前缀和优化

#include<bits/stdc++.h>
using namespace std;
int T,n,m,vis[2500][2500],f[2500][2500];
int read()
{
    
    
    int x=0;char c=getchar();
    while(c>'9'||c<'0')c=getchar();
    while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
    return x;
}
int main()
{
    
    
     
      
    f[0][0]=1;
    for(int i=1;i<=1001;i++)//预处理
    for(int j=1;j<=1001;j++)
    {
    
    
        f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1];//前缀和优化
        if(!vis[i][j])
        {
    
    
            f[i][j]++;
            int tep=0;
            while(i*tep<=1001&&j*tep<=1001)
            vis[i*tep][j*tep]=1,tep++;
        }
    }
    T=read();
    while(T--)
    {
    
    
        n=read();m=read();
        printf("%d\n",f[n][m]+4);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yhhy666/article/details/108245578