80分WA求调!(悬赏一关注,注释思路都打到代码里了)
查看原帖
80分WA求调!(悬赏一关注,注释思路都打到代码里了)
346352
_Aniya_楼主2022/10/17 19:27
#include<bits/stdc++.h>
using namespace std;
int k,n;
int x[105];
int r;//r表示用了几台机器 
int sum;//sum表示清洗次数 
map<int,int>w;//w[i]表示每一台机器对应的水果 
map<int,int>::iterator iter;
map<int,int>W;//W[i]表示i这种水果是否有机器在榨 
int main(){
	cin>>k>>n;
	for(int i=1;i<=n;i++){
		cin>>x[i];
	}
	for(int i=1;i<=n;i++){	
		if(W[x[i]]==0){
			if(r<k){//还有多余的榨汁机 
				r++;
				w[r]=x[i];
				W[x[i]]=1;
			}else{//需要选择一个来清洗 
				//遍历每一台机器,找到最靠后的果汁对应的榨汁机,清洗它
				int u=0;//u:最晚果汁在x中的位置 
				int Z=0;//Z:最晚果汁对应的榨汁机编号 
				int O=0;//O:最晚果汁对应水果的编号 
				for(iter=w.begin();iter!=w.end();iter++){
					//iter->first 目前这台机器的编号
					//iter->second 目前这台机器炸的果汁的编号 
					int p=0;//p:目前这台机器里面炸的果汁在原数组中的最晚编号 
					int z=0;//z:目前这台机器的编号 
					int o=0;//o:目前这台机器里面炸的果汁的编号 
					if((iter->first)!=0){
						//寻找iter->second的最晚的位置
						//p表示最晚的位置 
						for(int j=n;j>=i+1;j--){//从j到i+1倒序遍历 
							if(x[j]==(iter->second)){
								p=j;
								z=iter->first;
								o=iter->second;
								break;
							}
						}
						//特判如果没有找到
						if(p==0){
							Z=iter->first;
							u=-1;
							O=iter->second;
							break;
						}
						if(p>u){
							u=p;
							Z=z;
							O=o;
						}
					}
				}
				w[Z]=x[i];//将Z这台机器里面的果汁换成目前的果汁x[i] 
				W[x[i]]=1;//x[i]这种果汁已经在炸了 
				W[O]=0;//原来最晚果汁不能炸了 
				sum++;
			}
		}
	}
	cout<<sum;
	return 0;
}
2022/10/17 19:27
加载中...