20250322网易互娱游戏研发
2025年3月31日大约 3 分钟
20250322网易互娱游戏研发
1. 股神小易
题面
n 天 m 支股票,求最大收益,输出每天买卖情况。
解法
贪心,每天选择一支收益最大的全买,第二天全部卖出。
参考程序
#include<bits/stdc++.h>
using namespace std;
double a[30][20005];
int ans[30][3];
int main(){
int n,m;
double k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=2;i<=n;i++){
double tmp=1;
for(int j=1;j<=m;j++){
if(a[i][j]/a[i-1][j]>tmp){
ans[i-1][2]=j;
ans[i][1]=j;
tmp=a[i][j]/a[i-1][j];
}
}
k*=tmp;
}
printf("%.4lf\n",k);
for(int i=1;i<=n;i++){
cout<<ans[i][1]-1<<' '<<ans[i][2]-1<<'\n';
}
return 0;
}2. 2048
题面
模拟2048游戏的运行结果
解法
直接模拟即可,需要注意以下情况:
- 三个相同数字合并时 1 1 1 0 需要合并成 2 1 0 0
- 2 2 4 0 只会合并成 4 4 0 0
参考程序
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[40][40];
int v[40][40];
int op[50];
int main(){
int t;
cin>>t;
while(t--){
int c;
cin>>c;
for(int i=1;i<=c;i++){
cin>>op[i];
}
int m,n;
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int k=1;k<=c;k++){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
v[i][j]=0;
}
}
if(op[k]==0){
for(int j=1;j<=n;j++){
for(int i=1;i<=m;i++){
if(a[i][j]==0) continue;
for(int ii=i;ii>1;ii--){
if(a[ii][j]==a[ii-1][j]){
if(v[ii-1][j]) break;
v[ii-1][j]=1;
a[ii-1][j]*=2;
a[ii][j]=0;
break;
}
else if(a[ii-1][j]==0){
a[ii-1][j]=a[ii][j];
a[ii][j]=0;
}
else break;
}
}
}
}
else if(op[k]==2){
for(int j=1;j<=n;j++){
for(int i=m;i>=1;i--){
if(a[i][j]==0) continue;
for(int ii=i;ii<m;ii++){
if(a[ii][j]==a[ii+1][j]){
if(v[ii+1][j]) break;
v[ii+1][j]=1;
a[ii+1][j]*=2;
a[ii][j]=0;
break;
}
else if(a[ii+1][j]==0){
a[ii+1][j]=a[ii][j];
a[ii][j]=0;
}
else break;
}
}
}
}
else if(op[k]==1){
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0) continue;
for(int jj=j;jj>1;jj--){
if(a[i][jj]==a[i][jj-1]){
if(v[i][jj-1]) break;
v[i][jj-1]=1;
a[i][jj-1]*=2;
a[i][jj]=0;
break;
}
else if(a[i][jj-1]==0){
a[i][jj-1]=a[i][jj];
a[i][jj]=0;
}
else break;
}
}
}
}
else{
for(int i=1;i<=m;i++){
for(int j=n;j>=1;j--){
if(a[i][j]==0) continue;
for(int jj=j;jj<n;jj++){
if(a[i][jj]==a[i][jj+1]){
if(v[i][jj+1]) break;
v[i][jj+1]=1;
a[i][jj+1]*=2;
a[i][jj]=0;
break;
}
else if(a[i][jj+1]==0){
a[i][jj+1]=a[i][jj];
a[i][jj]=0;
}
else break;
}
}
}
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<' ';
}
cout<<'\n';
}
}
return 0;
}3. 星际探险
题面
解四元一次方程 ?x + ?y + ?z + ?w = n
变量范围0-2500
解法
范围不大,跑三层循环剪枝一下就过了
参考程序
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll x,y,z,w,n;
cin>>x>>y>>z>>w>>n;
int flag=0;
ll tmp;
for(int i=0;i<=2500;i++){
if(flag) break;
tmp=n-i*x;
if(w*2500+z*2500+y*2500<tmp) continue;
if(tmp<0) break;
for(int j=0;j<=2500;j++){
if(flag) break;
tmp=n-i*x-j*y;
if(w*2500+z*2500<tmp) continue;
if(tmp<0) break;
for(int k=0;k<=2500;k++){
tmp=n-i*x-j*y-k*z;
if(w*2500<tmp) continue;
if(tmp<0) break;
if(w){
if(tmp%w==0){
cout<<i<<' '<<j<<' '<<k<<' '<<tmp/w<<'\n';
flag=1;
break;
}
}
else{
if(tmp==0) cout<<i<<' '<<j<<' '<<k<<' '<<0<<'\n';
flag=1;
break;
}
}
}
}
if(!flag) cout<<-1;
return 0;
}