题目列表

奶牛式乘法

题目很简单,就是每位数字相乘做加法。

下列描述中,均将两个数字 $A,B$ 分别用字符串 $S,T$ 表示,$n=\left|S\right|,m=\left|T\right|$。

很显然,有一种 $\mathcal O(nm)$ 的写法,直接模拟题意。

代码

#include<bits/stdc++.h>
using namespace std;
string a,b;
int ans;
int main()
{
    cin>>a>>b;
    for(int i=0;i<a.size();i++)
    {
        for(int j=0;j<b.size();j++)
        {
            ans+=(int)(a[i]-'0')*(int)(b[j]-'0');
        }
    }
    cout<<ans<<endl;
    return 0;
}

当然,我们做一个乘法分配律的逆运用。

$S_1\times T_1 + S1 \times T_2 + \dots +S_n\times T_1 + S_n \times \dots + S_n\times T_m$。

然后会发现,上式即为 $(S_1+\dots+S_n)\times T_1+(S_1+\dots+S_n)\times T_2+\dots +(S_1+\dots+S_n)\times T_m$。

再次合并,即为 $(S_1+\dots +S_n)\times (T_1+\dots+T_m)$,也就是数字和相乘。

复杂度仅为 $\mathcal O(n+m)$。

代码 ```cpp #include using namespace std; string a,b; int suma,sumb; int main() { cin>>a>>b; for(int i=0;i using namespace std; string a,b; int suma,sumb; int main() { cin>>a>>b; if(a=="1") { if(b=="1")puts("1"); else if(b=="2")puts("2"); else .... else puts("1"); } else if(a=="2") { ... } else { ... } return 0; } ``` [/collapse] 没事,一共才 $10^9 \times 10^9=10^{18}$ 次打表((( #### [回文串](/problem/20220714/str) 双指针,分类讨论。 对于对应的两个字符,有一下情况: -

$s_l=\tt{*}$

-

$s_r=\tt{*}$

为了字典序最小,我们选择最小的 $\tt{A}$。 -

$s_r \neq \tt{*}$

为了保持回文,我们把 $s_l$ 换为 $s_r$。 -

$s_r=\tt{*}$

-

$s_l=\tt{*}$

为了字典序最小,我们选择最小的 $\tt{A}$。 -

$s_l \neq \tt{*}$

为了保持回文,我们把 $s_r$ 换为 $s_l$。 -

上述条件均不满足

- 无解。
代码

```cpp #include using namespace std; string s; int len,l,r; int main() { cin>>s; len=s.size(); l=0; r=len-1; while(l #define min(a,b) (a>b?b:a) using namespace std; int a[10]; void solve() { long long ans=0; int minn=INT_MAX,cnt=0; for(int i=1;i>a[i]; cnt+=(a[i]!=0); } while(1) { minn=INT_MAX; cnt=0; for(int i=1;i>t; while(t--) { solve(); } return 0; } ```

#### 流星雨 bfs。 先把陨石投放时间记一下,然后 bfs Bessie 位置,如果那个地方没有陨石就输出,反之继续把位置入队。
代码

```cpp #include using namespace std; struct node { int x,y,t; }; int mp[500][500],z; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; queueq; bool vis[500][500]; bool in(int x,int y) { return !vis[x][y]&&0=0&&Y>=0)mp[X][Y]=min(t,mp[X][Y]); } } void walk(int x,int y,int t) { for(int i=0;it+1) { q.push({X,Y,t+1}); } } } } int main() { memset(mp,0x3f,sizeof(mp)); int n,x=0,y=0; z=mp[0][0]; cin>>n; for(int i=1;i>x>>y>>t; f(x,y,t); } q.push({0,0,0}); while(!q.empty()) { node u=q.front(); q.pop(); vis[u.x][u.y]=1; walk(u.x,u.y,u.t); } cout #include using namespace std; int x,y,a,b,c,cur,cnt; int main() { cin>>x>>y; if(x==y){coutb)swap(a,b); if(b>c)swap(b,c); if(a>b)swap(a,b); a=b+c-1; if(a>x)a=x; } cout
最后修改:2023 年 04 月 23 日
v我50吃疯狂星期四