常白山算法

 机器翻译

#include<bits/stdc++.h>
using namespace std;


//设置一个数组vis用来记录当前数据num是否在内存空间中,如果在则vis[num]=1,否则为0
//设置一个数组temp来存放文章的单词,即后输入的n个数字;设置pos来指向temp最新存放的数据
//存储顺序

int vis[1010];  
int temp[1010];   //需要拿一个叔祖存储一下输入元素的位置,不然光拿一个数组根本不行啊
int temppos;//记录temp数组的位置
int m,n;

int main()
{
     cin>>m>>n;
     int count=0;//记录内存空间中的数字个数
     int cnt = 0; //记录查找字典的次数
     int num; //记录输入进来的文章
     
    for(int i=1;i<=n;i++)
    {
        cin>>num;
        if(vis[num]==1)
            continue;
        cnt++;
        
        //如果内存空间满了
        if(count>=m)
        {
            vis[temp[temppos-m]]=0;    //将最先进入内存空间的数字置空 
            vis[num]=1;
            temp[temppos++]=num;
        }
        
        else{
            vis[num]=1;
            temp[temppos++]=num;
            count++;
        }
        
    }
    cout<<cnt<<endl;
    return 0;
}
[NOIP2016]回文日期

#include<iostream>
using namespace std;

typedef long long ll;
//日期的二句必会话,存储每个月有多少天
int dx[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

//判断闰年
bool judge_run(int y)
{
    return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}

//判断回文
bool judge_hui(ll res)
{
    ll x=res,y=0;
    while(x)
    {
         y=y*10+x%10;
         x/=10;
    }
    return res==y;
}

//日期求总和
ll add(int y, int m, int d)
{
    return y * 10000 + m * 100 + d;
}

int main()
{
    ll da1,da2,res=0;
    cin>>da1>>da2;
    int y=da1/10000,m=(da1/100)%100,d=da1%100;
    while(add(y,m,d)<=da2)
    {
        if(judge_hui(add(y,m,d)))
            res++;
        if(judge_run(y)&&m==2)
        {
            if(d==dx[m]+1)
            {
                d=1;
                m++;
            }
            else
                d++;
        }
        else
        {
            if(d==dx[m])
            {
                d=1;
                if(m==12)
                {
                    m=1,y++;
                }
                else
                    m++;
            }
            else d++;
        }
    }
    cout<<res<<endl;
    return 0;
}
铺地毯

#include<bits/stdc++.h>
using namespace std;

//开个结构体存储数组,各个点和坐标
struct X{
    int a,b,g,k;
}mt[10005];

int main(){
    int n,i,ans=-1,x,y;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d%d%d%d",&mt[i].a,&mt[i].b,&mt[i].g,&mt[i].k);
    }
    scanf("%d%d",&x,&y);
    //直接从后往前枚举,尝试
    for(i=n;i>=1;i--){
        if(mt[i].a<=x&&x<=mt[i].a+mt[i].g&&mt[i].b<=y&&y<=mt[i].b+mt[i].k){
            ans=i;
            break;
        }
    }
    cout<<ans;
    return 0;
}
 校门外的树
//每次输入左右区间就把数组对应位置+1表示将这棵树移走,重复部分多次加1不要紧,我们结果看有多少为0
//差分+前缀和
//1.给一个区间加上一个值,我们只要考虑两个端点,中间的元素不需要考虑。
//2.前缀和
#include<bits/stdc++.h>
using namespace std;

int a[10005],ans;

int main()
{
    int l,m,x,y;
    cin>>l>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        a[x]+=1;
        a[y+1]-=1;
    }
    for(int i=0;i<=l;i++)
    {
        a[i]+=a[i-1];
        if(!a[i]) ++ans;
    }
    cout<<ans;
    return 0;
}
CQOI2009]中位数图

//中位数题目
//先初始化数组,按上面说的换成-1,1。
//观察左边,右边,二边

#include<iostream>
using namespace std;

const int MAXN=1e5+7;
int n,b,a[MAXN],num[MAXN<<1];

int main()
{
    cin>>n>>b;
    int pos=0;   //标记中位数位置
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]>b)  a[i]=1;
        else if(a[i]<b)  a[i]=-1;
        else pos=i;
    }
    int sum=0,ans=1;
    for(int i=pos-1;i>=1;i--)  //先看左边
    {
        sum+=a[i];
        num[n+sum]++;
        if(!sum)   ans++; 
    }
    sum=0;
    for(int i=pos+1;i<=n;i++)
    {
        sum+=a[i];
        ans+=num[n-sum];//左边与右边搭配的情况
        if(!sum)   ans++;
    }
    cout<<ans<<endl;
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值