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;
}