抢一波题解。
Solution
首先求期望拿到的核桃卷段数量,由于是期望,所以不存在什么核桃卷在这之前已经被拿走的情况,所以拿走的段数就是 K−P+1。
1 2 3 4 5
| for(int i=1;i<=n;i++) if(r[ans]-l[ans]+1<r[i]-l[i]+1) ans=i; cout<<ans<<"\n";
|
然后求实际拿到的,我们开一个标记数组 vis,表示这个点到底有没有被拿走,没被拿走就拿走并标记。
1 2 3 4 5 6 7
| for(int i=1;i<=n;i++){ for(int j=l[i];j<=r[i];j++){ if(!vis[j])vis[j]=1,cnt[i]++; else ; } if(cnt[ans]<cnt[i])ans=i; }
|
整体代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include<bits/stdc++.h> using namespace std; int m,n,l[1145],r[1145],ans,cnt[1145]; bool vis[1145]; int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>m>>n; for(int i=1;i<=n;i++)cin>>l[i]>>r[i]; for(int i=1;i<=n;i++)if(r[ans]-l[ans]+1<r[i]-l[i]+1)ans=i; cout<<ans<<"\n"; ans=0; for(int i=1;i<=n;i++){ for(int j=l[i];j<=r[i];j++){ if(!vis[j])vis[j]=1,cnt[i]++; else ; } if(cnt[ans]<cnt[i])ans=i; } cout<<ans; return 0; }
|