1 条题解

  • 0
    @ 2026-5-19 1:10:00

    题意简述

    nn 头奶牛需要挤奶,并且有 mm 头奶牛产生了阶级,阶级高的奶牛必须比阶级低的奶牛先挤奶,有 kk 头奶牛只允许她们在一个特定的位置挤奶,让你求第 11 头奶牛最早可以在第几个挤奶。

    解题思路

    若要使第 11 头奶牛更早地挤奶,应当考虑以下两种情况。

    1. 奶牛 11 在阶级中,那么只要把比他阶级高的奶牛尽量往前放,就能使奶牛 11 更早的挤奶。
    2. 奶牛 11 不在阶级中,那么只要把有阶级的奶牛尽量往后放,就能使奶牛 11 更早的挤奶。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const ll N = 105;
    ll a[N], n, m, k, b[N], c[N], vis[N];//vis[i]表示被安排在第i个位置的奶牛编号
    bool flag;
    ll find(ll x){//找到奶牛x在第几个挤奶
    	for(int i = 1; i <= n; i++){
    		if(vis[i] == x){
    			return i;
    		}
    	}
    	return -1;
    }
    int main(){
    	cin >> n >> m >> k;
    	for(int i = 1; i <= m; i++){
    		cin >> a[i];		
    		if(a[i] == 1){//证明奶牛1在阶级中
    			flag = 1;
    		}
    	}
    	for(int i = 1; i <= k; i++){
    		cin >> b[i] >> c[i];
    		vis[c[i]] = b[i];
    	}
    	ll tmp = 1;
    	if(flag){//第一种情况
    		for(int i = 1; i <= n;){
    		    if(find(a[tmp]) != -1){
    		    	i = find(a[tmp]) + 1;//阶级高的奶牛往前放
    		    	tmp++;
    		    	continue;
    			}
    			if(!vis[i]){
    				vis[i] = a[tmp];
    				if(a[tmp] == 1){
    					cout << i;
    					break;
    				}
    				tmp++;
    			}
    			i++;
    		}
    	}else{//第二种情况
        	for(int i = 1; i <= m; i++){
        		ll wz = find(a[i]), tmp = i;
        		if(wz != -1){
        			for(int j = wz - 1; j >= 1 && tmp != 1; j--){
        				if(!vis[j] && find(a[tmp - 1]) == -1){
        					vis[j] = a[--tmp];//有阶级的奶牛往后放
        				}
        			}
        		}
        	}
        	for(int i = 1; i <= n; i++){//因为阶级已经处理完了,所以没有被安排的最早位置就是奶牛1的最早挤奶位置
        	    if(!vis[i]){
        	        cout << i;
        	        break;
        	    }
        	}	    
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    6788
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    540
    已通过
    7
    上传者