算法思路:模拟
可能的解法:???
#include
using namespace std;
const int N=1e5+10;
int n,m,now=0;
int d[N];
string s[N];
int main(){
//freopen("toy.in","r",stdin);
//freopen("toy.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&d[i]);
cin>>s[i];
}
while(m--){
int dire,num;
scanf("%d %d",&dire,&num);
if(d[now]) num=-num;
if(dire) num=-num;
now=now+n-num;
while(now>=n) now-=n;
}
cout<<s[now];
return 0;
}
估分:100
实际得分:100
想法:大模拟,num正负左右横移 ,签到题。
(自认为写的还是比较短的)
算法思路:大模拟 × \times × 2
可能的解法:???
#include
using namespace std;
int a[50][50];
int n;
int main(){
//freopen("magic.in","r",stdin);
//freopen("magic.out","w",stdout);
scanf("%d",&n);
int tot=n*n-1;
a[1][n/2+1]=1;
int i=1,j=n/2+1;
while(tot--){
if(i==1&&j!=n){
i=n;j++;
}
else if(j==n&&i!=1){
j=1;i--;
}
else if(i==1&&j==n){
i++;
}
else if(a[i-1][j+1]==0){
i--;j++;
}
else{
i++;
}
a[i][j]=n*n-tot;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
估分:100
实际得分:100
想法:模拟 × \times × 2
算法思路:感觉类似前缀和
可能的解法:优先队列
#include
using namespace std;
int const N=8*1e6;
int n,m,q,u,v,t,qz;
double p;
int a[N];
int main(){
//freopen("earthworm.in","r",stdin);
//freopen("earthworm.out","w",stdout);
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=(double)u/v;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int cnt=n;
sort(a+1,a+cnt+1);
for(int i=1;i<=m;i++){
int x=a[cnt]+qz;
if(i%t==0) printf("%d ",x);
int d1=floor(p*x);
int d2=x-floor(p*x);
cnt++;a[cnt-1]=d1-qz-q;a[cnt]=d2-qz-q;
sort(a+1,a+cnt+1);
qz+=q;
}
printf("\n");
for(int i=t;i<=cnt;i+=t){
printf("%d ",a[cnt-i+1]+qz);
}
return 0;
}
估分:60
实际得分:35
一次订正(使用优先队列90pts)
#include
using namespace std;
int n,m,q,u,v,t,qz;
double p;
priority_queue<int> a;
int main(){
//freopen("earthworm.in","r",stdin);
//freopen("earthworm.out","w",stdout);
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
p=(double)u/v;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
a.push(x);
}
for(int i=1;i<=m;i++){
int x=a.top()+qz;
if(i%t==0) printf("%d ",x);
int d1=floor(p*x);
int d2=x-floor(p*x);
a.pop();
a.push(d1-qz-q);
a.push(d2-qz-q);
qz+=q;
}
printf("\n");
for(int i=1;i<=n+m;i++){
if(i%t==0){
int x=a.top();
printf("%d ",x+qz);
}
a.pop();
}
return 0;
}
想法:高分易,满分难。
算法思路:模拟骗分
可能的解法:???
#include
using namespace std;
int a[1010][30100];
int n,m,q;
int main(){
//freopen("phalanx.in","r",stdin);
//freopen("phalanx.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=(i-1)*m+j;
}
}
while(q--){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",a[x][y]);
int away=a[x][y];
for(int i=y;i<m;i++){
a[x][i]=a[x][i+1];
}
for(int i=x;i<n;i++){
a[i][m]=a[i+1][m];
}
a[n][m]=away;
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}*/
}
return 0;
}
估分:40
实际得分:30
想法:紫题万岁!
总得分
265/400
反思:基础数据结构要会用 (priority_queue不会写的悲伤)
蒟蒻的国庆模拟赛(二)
——2021.10.4