简单场

A 二分查找

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,t;
const int N=1e6+5;
ll num[N];

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for (ll i=0;i<n;i++)
    {
        cin>>num[i];
    }
    sort(num,num+n);
    while(m--)
    {

        cin>>t;
        ll x=lower_bound(num,num+n,t)-num;
        if(x<n&&num[x]==t)
            puts("YES");
        else 
            puts("NO");
    }
    return 0;
    
}

B 高精度 斐波那契数列

#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long LL;
typedef double db;
string add(string x,string y)
{
    int n=x.length();
    int m=y.length();
    if(m>n)//为了方便,令y为短的那个数
    {
        swap(x,y);
        swap(n,m);
    }
    string ans;
    int t=0,c=0,d=n-1;
    for(int i=m-1;i>=0;i--)//对齐最短的,从尾部相加
    {
        int s=x[d--]-'0'+y[i]-'0'+c,flag=0;//c用于进位,flag标记是否要进位
        if(s>9)
        {
            s=s-10;
            flag=1;//标记要进位
        }
        ans+=s+'0';//赋给新串
        if(flag)//需要进位则下一位+1
            c=1;
        else
            c=0;
    }
    for(int i=d;i>=0;i--)//将长的剩下的赋给新串
    {
        int s=x[i]+c-'0',flag=0;
        if(s>9)
        {
            s=s-10;
            flag=1;
        }
        ans+=s+'0';
        if(flag)
            c=1;
        else
            c=0;
    }
    if(c)//最后还剩一位没进
    {
        ans+=1+'0';
    }
    string f;
    for(int i=ans.length()-1;i>=0;i--)//将字符串翻转
        f+=ans[i];
    return f;
}
int main()
{
    string a,b,c;
    a="2",b="3";
    int n;
    scanf("%d",&n);
    if(n==1){
        cout<<2<<endl;
        return 0;
    }
    if(n==2){
        cout<<3<<endl;
        return 0;
    }
    for(int i=3;i<=n;i++){
        c=add(a,b);
        a=b,b=c;
    }
    cout<<c<<endl;
    return 0;
}

C 差分

#include<cstdio>
#define N 100000007
using namespace std;
int L,m,l,r,sum;
int cf[N];
int main()
{
    scanf("%d%d",&L,&m);
    while(m--)
    {
        scanf("%d%d",&l,&r);
        cf[l]++;
        cf[r+1]--;  //差分可以记录有多少暴政的人类砍了这棵树
    }
    for(int i=0,now=0;i<=L;++i) {
        now += cf[i];
        if(now<=0) sum++;
    }
    printf("%d",sum);
    return 0;
}

B 零钱兑换 背包问题

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int M=1e5+10;
int coin[13]={1,2,5,10,20,50,100,200,500,1000,2000,5000,10000};
int dp[M];

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
         int n;
    scanf("%d",&n);
    memset(dp,0,sizeof(dp));
    dp[0]=1;
    for (int i=0;i<13;i++)
    {
        for (int j=coin[i];j<=n;j++)
        {
            dp[j]=(dp[j]+dp[j-coin[i]])%mod;
        }
    }
        cout<<dp[n]<<endl;
    }
   
    
    return 0;
    
}

砝码与天平
将m转化成w进制,然后从小的位数开始遍历一遍如果为0或1不进行操作,如果为w-1则加上一个数使得当前位数变成0,如果为其他数着就可以直接输出NO,如果没有输出NO 则最后输出YES

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n,m;
    int t,x;
    long long a[100];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&m);
        x=0;
        int flag=0;
        memset(a,0,sizeof(a));
        while(m>0)
        {
            a[x++]=m%n;
            m/=n;
            cout<<a[x-1]<<endl;
        }
        int win=0;
        for(int i=0; i<x; i++)
        {
            if(a[i]==0||a[i]==1)
                continue;
            else if(a[i]==n-1)
            {
                int k=i+1;
                int s=1;
                while(s)
                {
                    a[k]+=s;
                    s=a[k]/n;
                    a[k]%=n;
                    k++;
                    if(x<k)
                        x=k;
                }
            }
            else
            {
                flag=1;
                break;
            }
        }
        if(flag)
            printf("NO\n");
        else
            printf("YES\n");
    }
}

进制转换


#include <bits/stdc++.h>
using namespace std;
const int maxn=5000+100;
char hashch[maxn];
int hashnum[maxn];
void init()
{
    char ch;
    for(int i=0; i<62; i++)
    {
        if(i<10)
            ch=i+'0';
        else if(i>=10&&i<36)
            ch='A'+i-10;
        else
            ch='a'+i-36;
        hashch[i]=ch;
        hashnum[ch]=i;
    }
}

string change(int m,int n,string str)
{
    bool flag;
    string ans="";
    int tmp,quotient,remainder;
    while(true)
    {
        flag=false;
        remainder=0;
        string div="";
        int len=str.length();
        for(int i=0; i<len; i++)
        {
            tmp = remainder*m+hashnum[str[i]];
            quotient=tmp/n;
            remainder=tmp%n;
            if(flag)
            {
                div+=hashch[quotient];
            }
            else
            {
                if(quotient!=0)
                {
                    flag=true;
                    div+=hashch[quotient];
                }
            }
        }
        ans=hashch[remainder]+ans;
        str=div;
        if(flag==false)
            break;
    }
    return ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值