1、玩具谜题(toy)
算法:模拟。水题
上代码
#include<bits/stdc++.h>
using namespace std;
vector<bool> a;
vector<string> b;
int main(){
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++){
int x;
string y;
cin>>x>>y;
a.push_back(bool(x));
b.push_back(y);
}
int vis=0;
for(int i=0;i<n;i++){
int flag,step;
scanf("%d%d",&flag,&step);
if(a[vis]^flag){
vis+=step;
if(vis>=m) vis-=m;
}
else{
vis-=step;
if(vis<0) vis+=m;
}
}
cout<<b[vis]<<endl;
return 0;
}
估分:100分
实际:100分
2、神奇的幻方(magic)
算法:也是模拟,照推就行。
上代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
bool vis[n][n];
int a[n][n],x=0,y=n/2;
for(int i=0;i<n;i++){
memset(a[i],0,sizeof(a[i]));
memset(vis[i],0,sizeof(vis[i]));
}
vis[x][y]=true;
a[x][y]=1;
for(int i=2;i<=n*n;i++){
if(x==0&&y!=(n-1)){
x=n-1;
y++;
}
else if(x!=0&&y==(n-1)){
y=0;
x--;
}
else if(x==0&&y==(n-1)){
x++;
}
else{
if(!vis[x-1][y+1]){
y++;
x--;
}
else{
x++;
}
}
a[x][y]=i;
vis[x][y]=true;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
估分:100分
实际:100分
3、蚯蚓(earthworm)
算法:二叉堆
代码(看到数据就知道自己过不去。)
#include<bits/stdc++.h>
using namespace std;
int heap[1000001],len=1;
void put(int x){
int p;
len++;
heap[len]=x;
p=len;
while(p!=1&&heap[p/2]<heap[p]){
swap(heap[p],heap[p/2]);
p=p/2;
}
}
int get(){
int x=heap[1],p,q;
heap[1]=heap[len];
len--;
p=1;
while(p*2<=len){
if(p*2+1>len||heap[p*2]>heap[p*2+1])
q=p*2;
else
q=p*2+1;
if(heap[p]<heap[q]){
swap(heap[p],heap[q]);
p=q;
}
else
return x;
}
return x;
}
int main(){
int n,m,q,u,v,t;
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
double p=double(u)/v;
memset(heap,0,sizeof(heap));
for(int i=1;i<=n;i++){
int r;
scanf("%d",&r);
put(r);
}
for(int i=1;i<=m;i++){
int topt=get();
int x1=floor(p*topt);
int x2=topt-x1;
for(int j=1;j<=len;j++)
heap[j]+=q;
if(i%t==0) printf("%d ",topt);
put(x1);
put(x2);
}
printf("\n");
for(int i=1;i<=(n+m);i++){
int topt=get();
printf("%d ",topt);
}
return 0;
}
估分:40分
实际:30分
我们不写代码,我们只是代码的搬运工
来自洛谷大佬的代码
#include<bits/stdc++.h>
#define N 7000005
using namespace std;
bool cmp(const int &a,const int &b){
return a>b;
}
priority_queue<int>ans;
int cut1[N],now[N],cut2[N];
int n,m,q,u,v,t;
int sigma;
double p;
int h,h1,h2;
int t0,t1,t2;
int main(){
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=(double)u/v;int tmp;
for(t0=1;t0<=n;++t0)
scanf("%d",&now[t0]);
--t0;t1=t2=0;h=h1=h2=1;
sort(now+1,now+t0+1,cmp);//对所有蚯蚓从大到小排序
int top;
for(int i=1;i<=m;++i){
if(h>t0){if(cut1[h1]>cut2[h2])top=cut1[h1++];else top=cut2[h2++];}
else if(now[h]>=cut1[h1]&&now[h]>=cut2[h2])top=now[h],++h;
else if(cut1[h1]>=cut2[h2]&&now[h]<=cut1[h1])top=cut1[h1],++h1;
else top=cut2[h2],++h2;
;;;//上述四行都是为了找到应该被切的蚯蚓,写的麻烦细节很多
top+=sigma;
int a1=floor(p*(double)top),a2=top-a1;
sigma+=q;
a1-=sigma,a2-=sigma;
cut1[++t1]=a1,cut2[++t2]=a2;
if(i%t==0)printf("%d ",top);
}
putchar('\n');
for(int i=h;i<=t0;++i)ans.push(now[i]);
for(int i=h1;i<=t1;++i)ans.push(cut1[i]);
for(int i=h2;i<=t2;++i)ans.push(cut2[i]);
for(int i=1;ans.size();++i){
if(i%t==0)printf("%d ",ans.top()+sigma);
ans.pop();
}
return 0;
}
4、列队(phalanx)
算法:线段树(不会) 暴力
但是。。。
暴了,然后爆了。。。
感想:代码什么的不存在的,只有一棵蒟蒻摆在这。
蒟蒻kounoZJH哒(不是)
正解不贴啦啊啊啊。