一些模版(基础)

高精度:
加法

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

未完待续…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值