0111集訓隊

参考ppt

原来是特殊情况

除以0与没考虑-1
大数加法
#include<bits/stdc++.h>
using namespace std;
char ch[2000];
char ch2[2000];
int num[2000];
int a[2000];
int b[2000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",ch);
        scanf("%s",ch2);
        int l =strlen(ch);
        int l2 =strlen(ch2);
        memset(a,0,sizeof(a));
        for(int i=1; i<=l; i++)
        {
            a[i]=ch[l-i]-'0';
        }
        memset(b,0,sizeof(b));
        for(int i=1; i<=l2; i++)
        {
            b[i]=ch2[l2-i]-'0';
        }
        memset(num,0,sizeof(num));
        int len =max(l,l2);
        for(int i=1; i<=len; i++)
        {
            num[i]=num[i]+a[i]+b[i];
            if(num[i]>=10)
                num[i+1]=num[i]/10;
            num[i]=num[i]%10;
        }
        if(num[len+1])
            len++;
 
        for(int i=len; i>=1; i--)
        {
            printf("%d",num[i]);
        }
 
        printf("\n");
    }
 
 
    return 0;
}
大数减法
#include<bits/stdc++.h>
using namespace std;
struct node
{
    int num[2000];
    int len;
 
} a,b,x;
char ch[2000];
char ch2[2000];
 
int check()
{
    if(a.len>b.len)
    {
        return 0;
    }
    else if(a.len<b.len)
    {
        return 1;
    }
    else
    {
        for(int i=a.len; i>=1; i--)
        {
            if(a.num[i]>b.num[i])
                return 0;
            if(a.num[i]<b.num[i])
            {
                return 1;
            }
        }
        return 2;
    }
 
}
 
 
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        bool f=0;
        scanf("%s",ch);
        scanf("%s",ch2);
        int l =strlen(ch);
        int l2 =strlen(ch2);
        memset(a.num,0,sizeof(a.num));
        a.len=l;
        b.len=l2;
        for(int i=1; i<=l; i++)
        {
            a.num[i]=ch[l-i]-'0';
        }
        memset(b.num,0,sizeof(b.num));
        for(int i=1; i<=l2; i++)
        {
            b.num[i]=ch2[l2-i]-'0';
        }
        memset(x.num,0,sizeof(x.num));
        if(check()==1)
        {
            swap(a,b);
            f=1;
        }
        if(check()==2)
        {
            printf("0\n");
        }
        else
        {
            int le =max(l,l2);
            int lesum=0;
            for(int i=1; i<=le; i++)
            {
//            cout<<a.num[i]<<"  "<<b.num[i]<<endl;
                x.num[i]=x.num[i]+a.num[i]-b.num[i];
                if(x.num[i]<0)
                {
                    x.num[i+1]--;
                    x.num[i]=10+x.num[i];
                }
            }
            int sub=le;
            while(x.num[sub]==0)
            {
                le--;
                sub--;
            }
            if(f==1)
            {
                printf("-");
            }
            for(int i=le; i>=1; i--)
            {
                printf("%d",x.num[i]);
            }
 
            printf("\n");
        }
    }
    return 0;
}
大数乘法(乘小数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ch[2000];
int num[2000];
int a[2000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll b;
        memset(ch,' ',sizeof(ch));
        scanf("%s",ch);
        scanf("%lld",&b);
//        cout<<ch<<endl;
//        cout<<b<<endl;
        int l =strlen(ch);
        memset(a,0,sizeof(a));
        for(int i=1; i<=l; i++)
        {
            a[i]=ch[l-i]-'0';
        }
        memset(num,0,sizeof(num));
        int len =l;
//        cout<<a[1]<<endl;
        for(int i=1; i<=len; i++)
        {
            num[i]=num[i]+a[i]*b;
            if(num[i]>=10)
                num[i+1]+=num[i]/10;
//            cout<<num[i]<<endl;
            num[i]=num[i]%10;
        }
        if(num[len+1])
            len++;
        for(int i=len; i>=1; i--)
        {
            printf("%d",num[i]);
        }
 
        printf("\n");
    }
 
 
    return 0;
}
大数除法(除小数)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
char ch[2000];
int num[2000];
int a[2000];
int mod[2000];
int sub[2000];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll b;
        memset(ch,' ',sizeof(ch));
        scanf("%s",ch);
        scanf("%lld",&b);
        int l =strlen(ch);
        memset(a,0,sizeof(a));
        for(int i=1; i<=l; i++)
        {
            a[i]=ch[l-i]-'0';
        }
        memset(num,0,sizeof(num));
        memset(mod,0,sizeof(mod));
        memset(sub,0,sizeof(sub));
        int len =l;
        for(int i=len; i>=1; i--)
        {
            sub[i]+=a[i];
            num[i]= sub[i]/b;
            int  m =sub[i]%b;
            sub[i-1]+=m*10;
            mod[i]= m;
        }
        int numlen=len;
        while(num[numlen]==0)
        {
           if(numlen==1)
           {
               break;
           }
            numlen--;
        }
        for(int i=numlen; i>=1; i--)
        {
            printf("%d",num[i]);
        }
        printf("\n");
        printf("%d\n",mod[1]);
//        cout<<mod[1]<<endl;
    }
    return 0;
}
二分系列(H题,I题,K题)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100010];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,q;
        scanf("%d%d",&n,&q);
        for(int i=1; i<=n; i++)
        {
            scanf("%lld",&a[i]);
        }
        sort(a+1,a+1+n);
 
        while(q--)
        {
            bool f1=0,f2=0;
            ll l,r;
            scanf("%lld%lld",&l,&r);
 
            int l1,r1;
            l1=1,r1=n;
            int ans=0;
            while(l1<=r1)
            {
                int mid =l1+r1>>1;
                if(a[mid]>=l)
                {
                    ans=mid;
                    f1=1;
                    r1=mid-1;
                }
                else
                {
                    l1=mid+1;
                }
            }
            int l2,r2;
            l2=1,r2=n;
            int ans2=0;
            while(l2<=r2)
            {
                int mid =l2+r2>>1;
                if(a[mid]<=r)
                {
                    ans2=mid;
                    f2=1;
                    l2=mid+1;
                }
                else
                {
                    r2=mid-1;
                }
            }
 
            if(f1&&f2)
                printf("%d\n",ans2-ans+1);
            else
                printf("0\n");
            }
 
    }
 
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =1e5+9;
int  a[maxn];
int h[maxn],w[maxn];
 
int n,k,x;
 
 
 
bool check(int mid)
{
    int num=0;
    for(int i=1; i<=n; i++)
    {
        num+=(h[i]/mid)*(w[i]/mid);
    }
    if(num>=k)
        return true;
    else
        return false;
}
 
 
int bi()
{
    int l=1,r=2*x;
    int ans=0;
    int mid;
    while(l<=r)
    {
        mid=l+r>>1;
        if(check(mid))
        {
            ans=mid;
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
    }
    return ans;
}
 
 
 
 
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        x=0;
        int temp;
        for(int i=1; i<=n; i++)
        {
            scanf("%d%d",&h[i],&w[i]);
            temp =max(h[i],w[i]);
            x =max(x,temp);
        }
        int len =bi();
 
        printf("%d\n",len);
    }
    return 0;
}
M题

WA原因

  1. a[i]是int 类型a[i] * a[i] 是long long类型会炸
  2. 减法取余:(ans[r][k]+k-ans[l-1][k])%k)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值