4 条题解
-
0
由于之前的题解
被最后一组毒瘤数据叉掉,导致我十分愤怒(对边XX的不满),我为此来拯救我的题解: 很明显,根据题意,可写出分代码 ():#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; }
如果要分,需要用单调队列优化:
#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
关于lmq诱导bdc加入大数据 问题分析: 给定n个站点,每站有油量gas[i]和到下一站的油耗cost[i]。汽车从某站出发(油量0),需找到所有能环行一周的起点。
方法:
-
暴力(O(n²)): 遍历每个起点,模拟行驶过程,检查油量是否始终非负。
-
优化法(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
#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; }
- 1
信息
- ID
- 211
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 232
- 已通过
- 3
- 上传者