高精度:
加法
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
char a1[1000],b1[1000];
int a[1000],b[1000],c[1000];
int main()
{
scanf("%s",a1);scanf("%s",b1);
if(a1[0]==48&&b1[0]==48)
{
cout<<"0"<<endl;
return 0;
}
int lena=strlen(a1),lenb=strlen(b1);
for(int i=0;i<lena;i++)
{
a[lena-i-1]=int(a1[i]-48);
}
for(int i=0;i<lenb;i++)
{
b[lenb-i-1]=int(b1[i]-48);
}
int m=max(lena,lenb);
for(int i=0;i<m;i++)
{
c[i]+=a[i]+b[i];
while(c[i]>=10)
{
c[i+1]++;
c[i]-=10;
}
}
m++;
while(c[m]==0)m--;
for(int i=m;i>=0;i--)
cout<<c[i];
cout<<endl;
return 0;
}
减法
#include<iostream>
#include<string>
int a[100001],b[100001],c[100001];
using namespace std;
int main()
{
string str1,str2;
long long i=1,t,l1,l2;
cin>>str1>>str2;
l1=str1.size();
l2=str2.size();
if (l1<l2)t=l2;
else t=l1;
for (int i=1;i<=l1;i++)
a[i]=str1[l1-i]-48;
for (int i=1;i<=l2;i++)
b[i]=str2[l2-i]-48;
if (l1<l2)
{for (int i=1;i<=t;i++)
swap(a[i],b[i]);
cout<<"-";
}
else {
if (l1==l2)
for (int i=1;i<=t;i++)
if (a[i]<b[i])
{
for (int j=1;j<=t;j++)
swap(a[j],b[j]);
cout<<"-";
break; }
}
while(i<=l1||i<=l2)
{
if (a[i]<b[i])
{
a[i]=a[i]+10;
a[i+1]=a[i+1]-1;
}
c[i]=a[i]-b[i];
i++;
}
while (c[i]==0 && i>1)
i--;
for(int z=i;z>=1;z--)
cout<<c[z];
return 0;
}
前缀和:
#include<iostream>
#include<algorithm>
using namespace std;
int n,k,i,maxx=-1000000;
int a[100010],b[100010];
int main()
{
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=b[i-1]+a[i];
}
for(i=k;i<=n;i++)
maxx=max(maxx,b[i]-b[i-k]);
cout<<maxx<<endl;
cin>>n;
return 0;
}
筛法
#include<iostream>
#include<cmath>
using namespace std;
int n,m;
int s;
int aa;
bool a[100000000];
int main()
{
cin>>n>>m;
s=sqrt(n);
a[1]=1;
for(int i=2;i<=s;i++)
{
if(a[i]==0)
{
for(int j=i*i;j<=n;j+=i)
a[j]=1;
}
}
for(int i=1;i<=m;i++)
{
cin>>aa;
if(a[aa]==0)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
cin>>n;
return 0;
}
背包:
01
#include<algorithm>
using namespace std;
int total,n,i;
int dp[505000],m[550]//体积,y[550]//价值;
int main()
{
cin>>total>>n;
for(i=1;i<=n;i++)
cin>>m[i]>>y[i];
for(i=1;i<=n;i++)
for(int c=total;c>=1;c--)
{
if(c>=m[i])
{
dp[c]=max(dp[c],dp[c-m[i]]+y[i]);
}
}
cout<<dp[total];
return 0;
}
完全
#include<iostream>
#include<algorithm>
using namespace std;
int n,i,j,total,dp[99999999],t[100000]//体积,v[100000]//价值;
int main()
{
cin>>total>>n;
for(i=1;i<=n;i++)
cin>>t[i]>>v[i];
for(i=1;i<=n;i++)
for(j=t[i];j<=total;j++)
dp[j]=max(dp[j],dp[j-t[i]]+v[i]);
cout<<dp[total];
return 0;
}
背包求总数:
(1):01
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int v[maxn],f[maxn];
int main(){
int n,m;
cin>>n>>m;
f[0]=1;
for(int i=1;i<=n;++i)
cin>>v[i];
for(int i=1;i<=n;++i)
for(int j=m;j>=v[i];--j)
f[j]+=f[j-v[i]];
cout<<f[m]<<endl;
return 0;
}
(2)完全
#include<cstdio>
#include<algorithm>
using namespace std;
long long money[30],dp[30005];
int main()
{
int v,n;
scanf("%d%d",&v,&n);
for(int i=1;i<=v;i++)
{
scanf("%d",&money[i]);
}
dp[0]=1;
for(int i=1;i<=v;i++)
{
for(int j=money[i];j<=n;j++)
{
dp[j]+=dp[j-money[i]];
}
}
printf("%lld",dp[n]);
return 0;
}
多重背包二进制拆分
while(scanf("%d %d", &n, &m) != EOF) {
int count = 0;
for(int i = 0; i < n; i++) {
scanf("%lld %lld %lld", &c[i], &w[i], &v[i]);
for(LL j = 1; j <= c[i]; j << 1) {
val[count] = j * v[i];
size[count++] = j * w[i];
c[i] -= j;
}
if(c[i] > 0) {
val[count] = c[i] * v[i];
size[count++] = c[i] * w[i];
}
}
memset(dp, 0, sizeof(dp));
for(int i = 0; i < count; ++i) {
for(int j = m; j >= size[i]; --j) {
dp[j] = max(dp[j], dp[j - size[i]] + val[i]);
}
}
最短路计数
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct E
{
int start,to;
}e[999999];
int n,m,P=0,a,b;
int d[999999],h[999999],ans[999999];
bool v[999999];
void add(int start,int to)
{
e[++P].to=to;
e[P].start=h[start];
h[start]=P;
}
void spfa(int p)
{
memset(d,0x3f,sizeof(d));
memset(v,0,sizeof(v));
queue<int> q;
d[p]=0;v[p]=1;ans[p]=1;
q.push(p);
while(!q.empty())
{
int k=q.front();
q.pop(); v[k]=0;
for(int i=h[k];i;i=e[i].start)
{
int t=e[i].to;
if(d[t]>d[k]+1)
{
d[t]=d[k]+1;ans[t]=ans[k];
if(v[t]==0){q.push(t);v[t]=1;}
}
else if(d[t]==d[k]+1)
{
ans[t]+=ans[k];
ans[t]=ans[t]%100003;
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>a>>b;
add(a,b);add(b,a);
}
spfa(1);
for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
cin>>n;
return 0;
}
未完待续…