4 条题解

  • 0
    @ 2025-7-5 16:31:07

    由于之前的题解被最后一组毒瘤数据叉掉,导致我十分愤怒(对边XX的不满),我为此来拯救我的题解: 很明显,根据题意,可写出8383分代码 (TimeExceededTimeExceeded):

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int m[200005];
    int w[200005];
    
    signed main(){
    	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>m[i];
    	}
    	for(int i=1;i<=n;i++){
    		cin>>w[i];
    	}
    	bool ok=0;
    	for(int i=1;i<=n;i++){
    		int oil=0;
    		bool flag=0;
    		for(int j=i;j<=n;j++){
    			oil-=w[j];
    			oil+=m[j];
    			if(oil<0){
    				flag=1;
    				break;
    			}
    		}
    		for(int j=1;j<i;j++){
    			oil-=w[j];
    			oil+=m[j];
    			if(oil<0){
    				flag=1;
    				break;
    			}
    		}
    		if(!flag){cout<<i<<' ';ok=1;}
    	}
    	if(!ok) cout<<"No Result!";
    	return 0;
    }
    

    如果要100100分,需要用单调队列优化:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=4e5+5;
    //注意数组开 2 倍,否则83分
    int n;
    int m[N];
    int w[N];
    int h[N];
    
    int head=0,tail=-1;
    int Q[N];//模拟队列 
    signed main(){
    	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>m[i];
    	}
    	for(int i=1;i<=n;i++){
    		cin>>w[i];
    		h[i]=h[i-1]+m[i]-w[i];
    	}
    	for(int i=n+1;i<=(n<<1);i++){
    		m[i]=m[i-n];
    		w[i]=w[i-n];
    		h[i]=h[i-1]+m[i]-w[i];
    	}//断环为链
    	bool ok=0;
    	for(int i=1;i<=(n<<1);i++){
    		while(head<=tail&&Q[head]<=i-n) head++;//i-n的前界
    		while(head<=tail&&h[Q[tail]]>h[i]) tail--;//最小所以是 >
    		Q[++tail]=i;
    		if(i>=n-1&&h[Q[head]]-h[i-n]>=0) cout<<i-n+1<<' ',ok=1;//过区间长度求区间最小值>=0,输出区间左端点
    	}
    	if(!ok) cout<<"No Result!";
    	return 0;
    }
    
    • 0
      @ 2025-7-5 16:27:36

      关于lmq诱导bdc加入大数据 ‌问题分析‌: 给定n个站点,每站有油量gas[i]和到下一站的油耗cost[i]。汽车从某站出发(油量0),需找到所有能环行一周的起点。

      方法‌:

      1. ​暴力(O(n²))​‌: 遍历每个起点,模拟行驶过程,检查油量是否始终非负。

      2. ​优化法(O(n))​‌:

        First ‌差值数组‌:计算diff[i]=gas[i]-cost[i],若总油量sum(diff)<0,直接无解。 Second ‌前缀和+单调队列‌:扩展diff为2n长(破环成链),用单调队列维护窗口最小值。若窗口内最小油量非负,则起点有效。

        At last 用优先队列排序有效起点,升序输出

      譬如‌:输入n=5,gas=[2,3,4,5,3],cost=[3,2,1,5,4],输出2 3。

      总结‌:单调队列优化窗口最小值查询,确保线性时间复杂度。

      关于单调队列优化流程本质‌:单调队列是一种‌高效维护滑动窗口极值‌的数据结构(O(1)),这里是最小值 理解:新元素入队时,强制移除队尾所有破坏单调性的旧元素(如维护单增队列时,剔除所有≥新元素的尾部数据)。自动检测并移除超出窗口范围的队首元素。

      • 0
        @ 2025-7-5 14:52:07
        #include<bits/stdc++.h>
        using namespace std;
        int w[2000],v[2000];
        int Fun(int x,int n,int sum,int num) {
          while(num<n) {
            sum+=w[x];
            sum-=v[x];
            if(sum<0)
              break;
            if(x+1==n) {
              x=0;
              num++;
            } else {
              x++;
              num++;
            }
          }
          if(num==n)
            return 1;
          else
            return 0;
        }
        int main() {
          int i,n,sum=0,aws[2000],k=0;
          scanf("%d",&n);
          for(i=0; i<n; i++)
            scanf("%d",&w[i]);
          for(i=0; i<n; i++)
            scanf("%d",&v[i]);
          for(i=0; i<n; i++)
            if(Fun(i,n,0,0)==1)
              aws[k++]=i+1;
          sort(aws,aws+k);
          if(k!=0) {
            printf("%d",aws[0]);
            for(i=1; i<k; i++)
              printf(" %d",aws[i]);
            puts("");
          } else
            	printf("No Result!\n");
          return 0;
        }
        
        • -8
          @ 2022-11-22 21:22:34

          这个题的样例输入我看不懂啊,有没有大佬教我亿下

          • 1

          信息

          ID
          211
          时间
          1000ms
          内存
          256MiB
          难度
          10
          标签
          (无)
          递交数
          232
          已通过
          3
          上传者