2 条题解

  • 0
    @ 2026-5-18 19:22:51

    题目分析

    cic_{i} 表示关闭第 ii 个农场的时间,tit_{i} 表示到第 ii 个农场的初始时间,用 lateilate_{i} 要想在关闭前到达第 ii 个农场的最晚时间,此时我们只需要把 latelate 数组从大到小排序即可,只要看第 vv 个是否能按时到达即可。因为数组有序,如果能到达,说明所有比他小的农场都可以到达。

    注意

    sort 函数实现的是数组从小到大排序,如果想要从大到小有两种实现方法,第一种是自己编写一个 cmp 函数;第二种方法,也是本篇用到的方法,利用 reverse 函数反转已经排完序,从小到大的数组,就可以实现从大到小,reverse 函数的使用方法和 sort 函数相同,具体请看代码。

    代码

    #include<bits/stdc++.h>
    using namespace std; 
    int n,q;
    int c[200005],t[200005];
    int late[200005];
    int main(){
    	cin >> n >> q;
    	for(int i=1;i<=n;i++){
    		cin >> c[i];//关闭时间 
    	}
    	for(int i=1;i<=n;i++){
    		cin >> t[i];//初始访问时间 
    	}
    	for(int i=1;i<=n;i++){
    		late[i] = c[i] - t[i];//最晚到达时间 
    	} 
    	sort(late+1,late+1+n);//排序
    	reverse(late+1,late+1+n);
    	for(int i=1;i<=q;i++){
    		int v,s;
    		cin >> v >> s;
    		if(s < late[v]) cout << "YES";//表示能够到达 
    		else cout << "NO";
    		cout << endl;
    	} 
    	return 0;
    }
    
    • 0
      @ 2025-10-8 17:14:15
      #include<bits/stdc++.h>
      using namespace std;
      const int N=2e5+10;
      int c[N],t[N];
      int main()
      {
          ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
          int n,q;cin>>n>>q;
          for(int i=1;i<=n;i++)cin>>c[i];
          for(int i=1;i<=n;i++)cin>>t[i];
          for(int i=1;i<=n;i++)c[i]-=t[i];
          sort(c+1,c+n+1);
          while(q--)
          {
              int v,s;cin>>v>>s;
              int vv=(upper_bound(c+1,c+n+1,s)-1)-c;
              vv=n-vv;
              if(vv>=v)cout<<"YES\n";else cout<<"NO\n";
          }
          return 0;
      }
      ```<br />
      • 1

      *【二分】访问最多农场[USACO24FEB] Maximizing Productivity B

      信息

      ID
      7653
      时间
      2000ms
      内存
      256MiB
      难度
      7
      标签
      递交数
      143
      已通过
      32
      上传者