模拟 一个称不太算上算法的算法 通俗来讲就是他让你干啥你就干啥 做就完了
所以这篇博客应该不太会有题解 因为没啥说的 跟着题里做就完事了
瞅了一眼 怎么tm题目里还有猪国杀 笑死 正好之前这题是黑题的时候一直想做但是懒得做 趁这个机会给他做了哈哈哈
传送门
直接离线做 贼简单 对了之前一直想用快读没用上 这回终于用上了哈哈 打一遍真爽
#include
using namespace std;
#define N int(1e4+10)
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int n,r[N][5],a,b,c,d,x,y,now=-1;
int main(){
read(n);
for(int i=1;i<=n;i++)read(r[i][1]),read(r[i][2]),read(r[i][3]),read(r[i][4]);
read(x),read(y);
for(int i=1;i<=n;i++){
a=r[i][1],b=r[i][2],c=a+r[i][3],d=b+r[i][4];
if(x>=a&&x<=c&&y>=b&&y<=d)now=i;
}
cout<<now<<endl;
}
传送门
这题真有意思 系数
0
1
−
1
0 \,\,\,\, 1 \, -1
01−1指数
0
1
0\,\,1
01都要特判 要不是能下载数据估计不能过这么快哈哈
对了多项式系数也可以是
0
0
0,这时候输入的是常数 直接输出常数就行
#include
using namespace std;
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int n,a;
int main(){
read(n);
if(n==0){
read(a);
cout<<a<<endl;
return 0;
}
for(int i=0;i<=n;i++){
read(a);
if(i==n){
if(!a)continue;
else if(a<0)printf("-%d\n",-a);
else printf("+%d\n",a);
}
else if(i==0){
if(!a)continue;
else if(a==-1)printf("-x^%d",n);
else if(a<0)printf("-%dx^%d",-a,n);
else if(a==1)printf("x^%d",n);
else printf("%dx^%d",a,n);
}
else if(i==n-1){
if(a==0)continue;
else if(a==-1)printf("-x");
else if(a<0)printf("-%dx",-a);
else if(a==1)printf("+x");
else printf("+%dx",a);
}
else {
if(a==0)continue;
else if(a==-1)printf("-x^%d",n-i);
else if(a<0)printf("-%dx^%d",-a,n-i);
else if(a==1)printf("+x^%d",n-i);
else printf("+%dx^%d",a,n-i);
}
}
}
传送门
还要一遍一遍看表格 真麻烦
#include
using namespace std;
#define N 220
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int check(int a, int b){
if(a==b)return 0;
if(!a){
if(b==1||b==4)return 2;
else return 1;
}
else if(a==1){
if(b==2||b==4)return 2;
else return 1;
}
else if(a==2){
if(b==0||b==3)return 2;
else return 1;
}
else if(a==3){
if(b==0||b==1)return 2;
else return 1;
}
else if(a==4){
if(b==0||b==1)return 1;
else return 2;
}
}
int n,ma,mb,suma,sumb,a[N],b[N];
int main(){
read(n),read(ma),read(mb);
for(int i=1;i<=ma;i++)read(a[i%ma]);
for(int i=1;i<=mb;i++)read(b[i%mb]);
for(int i=1;i<=n;i++){
int now=check(a[i%ma],b[i%mb]);
if(now==2)sumb++;
else if(now==1)suma++;
}
printf("%d %d\n",suma,sumb);
}
传送门
内侧向左数和外侧向右数都是顺时针 顺时针编号递减
#include
using namespace std;
#define N int(1e5+10)
#define reg register
struct node{
int s;
char nam[11];
}toy[N];
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
int n,m,x,y,now=1;
int main(){
read(n),read(m);
for(reg int i=1;i<=n;i++)scanf("%d%s",&toy[i].s,toy[i].nam);
toy[0]=toy[n];
for(reg int i=1;i<=m;i++){
read(x),read(y);
if(x+toy[now].s==1)(now+=y)%=n;
else ((now+=n)-=y)%=n;
}
puts(toy[now].nam);
}
传送门
什么破
b
b
b题 正好打完最后还要输出
0
:
0
s
b
0:0\,\,sb
0:0sb
#include
using namespace std;
#define N 100000
char chr;
bool flag;
int ow[N],ol[N],nw[N],nl[N],now,nol,nnw,nnl,pnto,pntn;
int main(){
while(chr!='E'){
chr=getchar();
while(chr!='W'&&chr!='L'&&chr!='E')chr=getchar();
if(chr=='E')break;
flag=1;
if(chr=='W')now++,nnw++;
else nol++,nnl++;
if((now>=21||nol>=21)&&abs(now-nol)>=2)ow[++pnto]=now,ol[pnto]=nol,now=nol=0;
if((nnw>=11||nnl>=11)&&abs(nnw-nnl)>=2)nw[++pntn]=nnw,nl[pntn]=nnl,nnw=nnl=0;
}
for(int i=1;i<=pntn;i++)printf("%d:%d\n",nw[i],nl[i]);
printf("%d:%d\n",nnw,nnl);putchar(10);
for(int i=1;i<=pnto;i++)printf("%d:%d\n",ow[i],ol[i]);
printf("%d:%d\n",now,nol);
}
传送门
???这题为啥不放到从零开始捏
#include
using namespace std;
int sum(int x){
int ans=0;
while(x){
if(x%10==2)ans++;
x/=10;
}
return ans;
}
int l,r,ans;
int main(){
cin>>l>>r;
for(int i=l;i<=r;i++)ans+=sum(i);
cout<<ans<<endl;
}
传送门
这题不是第一次做了哈哈 还记得第一次做的时候贼惊讶 原来幻方可以一个一个填哈哈 有时间研究研究
这题就照着他说的做就行了
#include
using namespace std;
#define N 40
int sqr[N][N],n,l[N*N],r[N*N];
int main(){
cin>>n;
sqr[1][n/2+1]=1,l[1]=1,r[1]=n/2+1;
for(int i=2;i<=n*n;i++){
if(l[i-1]==1&&r[i-1]!=n)l[i]=n,r[i]=r[i-1]+1,sqr[n][r[i-1]+1]=i;
else if(r[i-1]==n&&l[i-1]!=1)r[i]=1,l[i]=l[i-1]-1,sqr[l[i-1]-1][1]=i;
else if(l[i-1]==1,r[i-1]==n)r[i]==n,l[i]=2,sqr[2][n]=i;
else{
if(sqr[l[i-1]-1][r[i-1]+1])l[i]=l[i-1]+1,r[i]=r[i-1],sqr[l[i-1]+1][r[i-1]]=i;
else l[i]=l[i-1]-1,r[i]=r[i-1]+1,sqr[l[i-1]-1][r[i-1]+1]=i;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(j==n)printf("%d\n",sqr[i][j]);
else printf("%d ",sqr[i][j]);
}
}
}
传送门
这个题真的好怀念 考场现场考过 当时不知道为什么 我是我们那学的还算挺好的 然后教练没给我报
N
O
I
P
,
NOIP,
NOIP,我还是以锻炼的名义去参加的,当时就打了
140
140
140分,忘了这个题得多少分了 反正不超过
20
20
20分
h
h
h
hhh
hhh现在想想如果考场把这个题敲出来教练会不会对我改变想法 让我接着学下去呢哈哈哈
先看语法错误 语法错误只有两种可能性
一是
F
F
F和
E
E
E不匹配 所以这里想到可以用栈来做
二是
F
F
F操作时 添加的变量是之前添加过且未销毁的变量 这个比较好弄 可以随时记录一个数组 添加变量就是
1
1
1销毁变量或者没添加过这个变量就是
0
0
0
上面说到要用栈,那么具体怎么操作呢
首先我想到的是栈里放所有变量 用一个
c
h
a
r
char
char类型的栈,但是后来我又放弃了这个想法 比如
F
F
F
E
F
E
E
E
FF\,\,FE\,\,FE\,\,EE
FFFEFEEE这样就没法维护循环层数了
想了想后来又把栈里的元素换成变量和循环数
对于每次
E
E
E操作,如果前面是一个变量 那就把变量弹出来 然后把这个循环的循环次数扔进栈里
如果前面是一个数 就是一个循环次数 那么说明这个循环次数是套在马上要弹出的这个循环里的
对于每次
F
F
F操作 只需计算每个循环的循环次数 并记录添加的变量即可
细节方面,因为
a
a
a的
a
s
c
i
i
ascii
ascii码远大于最大循环数
1
/
2
L
m
a
x
=
50
^1/_2L_{max}=50
1/2Lmax=50 所以用
0
−
50
0-50
0−50表示循环次数 用
′
a
′
−
′
z
′
'a'-'z'
′a′−′z′表示变量(我刚开始用
‘
0
’
−
‘
0
’
+
50
‘0’-‘0’+50
‘0’−‘0’+50表示的循环次数 因为和
′
a
′
−
′
z
′
'a'-'z'
′a′−′z′有重叠 死得很惨 哈哈哈哈
做完看了眼题解 我这思路应该算是比较麻烦的 毕竟是大模拟题 只要思路清晰 代码打的不乱 就能对 每个人都有每个人的做法
#include
using namespace std;
inline void read(int &x){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
x=s*w;
}
char chr,now,flag,res[1000];
int T,L,pre,pnt,x,y,pd,o[30],c[30],stk[200];
void push(int x){stk[++pnt]=x;}
bool empty(){return !pnt;}
void pop(){pnt--;}
int top(){return stk[pnt];}
int main(){
read(T);
while(T--){
memset(c,0,sizeof c);memset(o,0,sizeof o);
read(L);chr=getchar();pnt=pd=pre=0,flag=10;
while(chr!='(')chr=getchar();
chr=getchar();
if(chr!='1'){
while(chr!='^')chr=getchar();chr=getchar();
while(chr>='0'&&chr<='9'){pre=(pre<<3)+(pre<<1)+(chr&15);chr=getchar();}
}
for(register int i=1;i<=L;i++){
x=y=0;
if(pd){gets(res);continue;}
chr=getchar();
while(chr!='E'&&chr!='F')chr=getchar();
if(chr=='E'){
if(empty()){pd=1;gets(res);continue;}
int ch=top();pop();
if(ch>=0&&ch<=50){
now=ch;
while(!empty()&&top()>=0&&top()<=50){
now=top()>now?top():now;
pop();
}
if(empty()){pd=1;gets(res);continue;}
c[top()-'a']=0;
if(flag>='a'&&flag<='z'){
if(flag==top())flag=10;
pop();push(0);continue;
}
if(o[top()-'a']<0){pop();push(0);}
else if(o[top()-'a']){pop();push(now+1);}
else {pop();push(now);}
}
else{
c[ch-'a']=0;
if(flag>='a'&&flag<='z'){
if(flag==ch)flag=10;
push(0);continue;
}
int nw=o[ch-'a'];
if(nw<0)nw=0;
now=nw;
while(!empty()&&top()>=0&&top()<=50){
now=top()>now?top():now;
pop();
}
push(now);
}
}
else{
char nam;
while(chr<'a'||chr>'z')chr=getchar();nam=chr;
if(c[nam-'a']){gets(res);pd=1;continue;}
int yy=0;
c[nam-'a']=1;push(chr);
while(chr!='n'&&(chr<'0'||chr>'9'))chr=getchar();
if(chr=='n')yy=1,chr=getchar();
while(chr>='0'&&chr<='9'){x=(x<<3)+(x<<1)+(chr&15);chr=getchar();}
while(chr!='n'&&(chr<'0'||chr>'9'))chr=getchar();
if(chr=='n'){
if(!yy)o[nam-'a']=1;
else o[nam-'a']=0;
continue;
}
while(chr>='0'&&chr<='9'){y=(y<<3)+(y<<1)+(chr&15);chr=getchar();}
o[nam-'a']=0;
if(yy||y<x){
if(flag<'a'||flag>'z')flag=nam;
o[nam-'a']=-1;
}
}
}
if(pd||empty())puts("ERR");
else{
int ck=top();pop();
if(ck>='a'&&ck<='z')puts("ERR");
else{
now=ck;
while(!empty()&&top()>=0&&top()<=50){
now=top()>now?top():now;
pop();
}
if(!empty())puts("ERR");
else if(now==pre)puts("Yes");
else puts("No");
}
}
}
}
还剩两道大模拟 有时间做就来更 实在是太费时间了