机器翻译

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