模拟求调,玄关
查看原帖
模拟求调,玄关
1041101
Aventurine_stone楼主2024/1/28 11:21
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
	{
		x=(x<<3)+(x<<1)+(c-'0');
		c=getchar();
	}
	return x;
}
inline void write(int x)
{
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
}
const int N=110;
int n,m,k,T;
int gun1,gun2;//当前主/副武器 
int use[N]={0,0,0,0,0,0,0,0,0,0,50,40,30,20,2,1,5};//占用空间 
int yuan[N]={0,0,0,0,0,0,0,0,0,0,10,11,12,13,14,15,16};
int you[N]={0,3,3,2,1,3,2,2,4,4};//武器优先级 
int t[N];//最晚拾取时间 
int wu[N]={0,14,14,14,14,15,15,15,16,16};//武器使用子弹类型 
int num[N];//物品数量 
int x=1,y=1;
int s;//当前剩余空间 
struct node{
	int bian;
	int zhu,fu;
	int num;
	bool vis;
};
node d[N][N];//地图 
void solve(int cnt)
{
	if(d[x][y].vis)
		return ;
	d[x][y].vis=1;
	if(d[x][y].bian<=9)//武器 
	{
		if(you[d[x][y].bian]>you[gun1])
			gun1=d[x][y].bian;
		else if(you[d[x][y].bian]>you[gun2]&&you[gun1]>you[d[x][y].bian])
			gun2=d[x][y].bian;
	}
	else if(d[x][y].bian<=16)//弹药 
	{
		if(s>=use[d[x][y].bian]*d[x][y].num)//全部装下 
		{
			s-=use[d[x][y].bian]*d[x][y].num;
			t[d[x][y].bian]=cnt;
			num[d[x][y].bian]+=d[x][y].num;
			return ;
		}
		int e=use[d[x][y].bian]*d[x][y].num-s;//需丢弃的子弹数
		while(e>0)
		{
			int diu=10;//本轮应该丢什么弹药 
			for(int i=10;i<=16;i++)
			{
				if(num[i])
				{
					if(diu==wu[gun1]||diu==wu[gun2]||diu<=13)
					{
						if(i!=wu[gun1]&&i!=wu[gun2]&&i>=14)
							diu=i;
						else if(t[i]<t[diu])
							diu=i;
					}
					else
					{
						if(i!=wu[gun1]&&i!=wu[gun2]&&i>=14&&t[i]<t[diu])
							diu=i;
					}
				}
			}
			int liang=0;//丢弃数量
			if(num[diu]*use[diu]<=e)//全部丢弃 
				liang=num[diu];
			else//部分丢弃 
			{
				liang=e/use[diu];
				if(e>liang*use[diu])
					liang++;
			}
			num[diu]-=liang;//丢子弹 
			e-=liang*use[diu];
		}
		s=-e;//剩余空间处理 
		t[d[x][y].bian]=cnt;
		num[d[x][y].bian]+=d[x][y].num;
	}
	else//敌人 
	{
		if(num[wu[gun1]]>=d[x][y].zhu)//主武器打击 
			num[wu[gun1]]-=d[x][y].zhu;
		else if(num[wu[gun2]]>=d[x][y].fu)//副武器打击
			num[wu[gun2]]-=d[x][y].fu;
		else
		{
			cout<<x<<" "<<y<<endl;
			exit(0);
		}
	}
}
int main()
{
	n=read(),m=read(),k=read(),T=read();
	k*=10;
	s=k;
	for(int i=10;i<=16;i++)
		t[i]=INT_MAX;
	for(int i=0;i<n*m;i++)
	{
		int hang=i/n+1,lie=i%n+1;
		d[hang][lie].bian=read();
		if(d[hang][lie].bian<=16)
			d[hang][lie].num=read();
		else
			d[hang][lie].zhu=read(),d[hang][lie].fu=read();
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cout<<d[i][j].bian<<" ";
		}
		cout<<endl;
	}
	short op;
	solve(1);
	int cnt=1;
	while(T--)
	{
		op=read();
		if(op==1)
			x--;
		else if(op==2)
			x++;
		else if(op==3)
			y--;
		else
			y++;
		solve(++cnt);
	}
	cout<<gun1<<endl;
	cout<<gun2<<endl;
	for(int i=10;i<=16;i++)
	{
		for(int j=i+1;j<=16;j++)
		{
			if(t[i]>t[j])
			{
				swap(t[i],t[j]);
				swap(num[i],num[j]);
				swap(yuan[i],yuan[j]);
			} 
		}
	}
	for(int i=10;i<=16;i++)
	{
		if(num[i])
		{
			cout<<yuan[i]<<" "<<num[i]<<endl;
		}
	}
	return 0;
}

评测记录(0分)

2024/1/28 11:21
加载中...