CF1808C 题解
Posted OceanLiu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1808C 题解相关的知识,希望对你有一定的参考价值。
可以考虑从小到大枚举差值$i$,再枚举最小数字$j$,这样当前的最大数字就是$i+j$,然后进行搜索,看在满足当前状态下是否能找到一个合法的数字,实际上就是在进行数位DP。
搜索中一些变量的解释:pos表示当前位,mx最大数字,mi最小数字,p前面枚举的数字是否在下界,q上界,now已经枚举的数字,limit前导$0$标志。
#include<bits/stdc++.h> #define int long long using namespace std; bool flag=0; int T,l,r,a[20],b[20]; void dfs(int pos,int mx,int mi,int p,int q,int now,int limit) if (flag==1) return; if (pos==0) flag=1; cout<<now<<endl; return; int st=0,ed=9; if (p) st=a[pos]; if (q) ed=b[pos]; for (int i=st;i<=ed;i++) if ((mi<=i&&i<=mx)||(limit&&(i==0))) dfs(pos-1,mx,mi,p&&(i==a[pos]),q&&(i==b[pos]),now*10+i,limit&&(i==0)); if (flag==1) break; signed main() cin>>T; while(T--) cin>>l>>r; for (int i=1;i<=19;i++) a[i]=l%10;l/=10; b[i]=r%10;r/=10; flag=0; for (int i=0;i<=9;i++)//mx-mi for (int j=0;j+i<=9;j++)//mi dfs(19,j+i,j,1,1,0,1); return 0;
cf:c题
代码:
#include<iostream> #include<algorithm> #include<vector> #include<string> #include<math.h> const int max_=1e5+5; using namespace std; vector<int>ve[max_]; int sum[max_]; int main() { int n,m; int ans,maxm=0; int len=0; scanf("%d %d",&n,&m); for(int i=0;i<n;i++) { int x,w; scanf("%d %d",&x,&w); ve[x].push_back(w); } for(int i=1;i<=m;i++) { sort(ve[i].begin(),ve[i].end(),greater<int>()); len=max(len,(int)ve[i].size()); } for(int i=1;i<=m;i++) { ans=0; for(int j=0;j<ve[i].size();j++) { ans+=ve[i][j]; if(ans<0) break; sum[j]+=ans; } } for(int i=0;i<len;i++) maxm=max(sum[i],maxm); cout<<maxm<<endl; }
以上是关于CF1808C 题解的主要内容,如果未能解决你的问题,请参考以下文章