• 牛客多校 1 (字典序 模拟 几何 斜率 启发式合并+缩边 期望dp )


     ACDGIJ 

    G-Lexicographical Maximum

    题意:

    给一个数字n,找到0~n中字典序最大的数字

    注意:

    99和996相比,996的字典序最大;个位数的话就是数字本身

    代码:

    我的和同学的

    1. #include
    2. using namespace std;
    3. int main()
    4. {
    5. bool f=0,to=0;string s;cin>>s;int n=s.size();
    6. for(int i=0;i
    7. if(i==n-1)to=1;
    8. if(s[i]!='9'){f=1;break;}
    9. }
    10. if(n==1)cout<
    11. else if(!f)cout<
    12. else {
    13. for(int i=0;i-1;i++)cout<<'9';
    14. if(to)cout<-1];
    15. }
    16. return 0;
    17. }
    1. #include
    2. using namespace std;
    3. string s;
    4. int main ()
    5. {
    6. cin>>s;int length=s.length();
    7. if (length<2)cout<
    8. else{
    9. int cnt=0;
    10. for (int i=1;i9;if (s[i-1]=='9')++cnt;}
    11. if (cnt==length-1)cout<-1];
    12. }
    13. }

    A-Villages: Landlines

    题意:

    给电力塔的坐标和有效范围,就需要连接所有塔的电线最小长度

    (感觉这道题就是题目理解上困难)

    代码:

    1. #include
    2. using namespace std;
    3. struct node{
    4. int l,r;
    5. }e[200005];
    6. bool cmp(node &x,node &y){return x.l
    7. int main()
    8. {
    9. int n;cin>>n;int x,r;
    10. for(int i=0;i>x>>r;e[i].l=x-r;e[i].r=x+r;}
    11. sort(e,e+n,cmp);
    12. int ans=0,maxx=e[0].r;
    13. for(int i=1;i
    14. if(e[i].l>maxx)ans+=(e[i].l-maxx);
    15. maxx=max(maxx,e[i].r);
    16. }
    17. cout<'\n';
    18. return 0;
    19. }

    D-Mocha and Railgun

    题意:普通的几何题目

    代码:

    1. #include
    2. using namespace std;
    3. int T;long long r;long long xq, yq, d;
    4. int main ()
    5. {
    6. cin >> T;
    7. for (int i=1;i<=T;++i){
    8. cin>>r;cin>>xq>>yq>>d;
    9. double dis=sqrt(1.0*xq*xq+1.0*yq*yq);
    10. double shu=sqrt( 1.0*r*r-1.0*(dis-d)*(dis-d) );
    11. double shuyou=sqrt( 1.0*r*r-1.0*(dis+d)*(dis+d) );
    12. double fin=sqrt(1.0*(shu-shuyou)*(shu-shuyou)+4.0*d*d);
    13. double sina=0.5*fin/r;
    14. double a=asin(sina);
    15. cout<setprecision(12)<<2.0*a*r<
    16. }
    17. }

    C-Grab the Seat!

    题目:

    有nm列的座位,范围是1≤ x ≤n, 1≤ y ≤m范围里的整数。(0, 1) 到 (0, m) 的线段是屏幕。已有k个人坐在位置上,q次修改,每次修改询问屏幕不会被人遮挡的位置的个数2≤n,m≤2×1e5,1≤k≤2×1e5,1≤q≤200

     

    注意:

    k是1~k;eps不能去太大

    代码:

    1. #include
    2. using namespace std;
    3. #define eps 1e-9
    4. int p[200005]={0},x[200005],y[200005],m1[200005],m2[200005];
    5. int n,m,k,q;
    6. int main()
    7. {
    8. cin>>n>>m>>k>>q;
    9. for(int i=1;i<=k;i++)cin>>x[i]>>y[i];
    10. while(q--){
    11. long long ans=0;
    12. int pi,xi,yi;
    13. cin>>pi>>xi>>yi;
    14. x[pi]=xi,y[pi]=yi;
    15. for(int i=1;i<=m;i++)p[i]=n+1;
    16. for(int i=1;i<=k;i++)p[y[i]]=min(p[y[i]],x[i]);
    17. double kk=0;
    18. for(int i=1;i<=m;i++){
    19. kk=max(kk,1.0*(i-1)/p[i]);
    20. if(kk==0)m1[i]=p[i]-1;
    21. else m1[i]=1.0*(i-1)/kk-eps;
    22. }
    23. kk=0;
    24. for(int i=m;i>0;i--){
    25. kk=min(kk,1.0*(i-m)/p[i]);
    26. if(kk==0) m2[i]=p[i]-1;
    27. else m2[i]=1.0*(i-m)/kk-eps;
    28. ans+=min(m1[i],m2[i]);
    29. }
    30. cout<'\n';
    31. }
    32. return 0;
    33. }

    J-Serval and Essay

    题目:

    有一张n个点m条边的无重边无自环的有向图;初始时选择一个点染黑,其余点均为白点;若某个点所有入边的起点均为黑点,则该点可以被染黑;最大化图中黑点数量。

    思路:

    如果一个点B的入度(A)为1,那么A的出边连接到B的出边连接的点,连接的点的入点为A

    用启发式合并,出边的size小的作为儿子,因为要合并边,每个儿子的出边连接的点的from都要变。

    注意:

    1.如何遍历set

    2.如何根据要求建图

    3.在merge中如果*it的入度为1,那么记得迭代,因为可能x和y都连着*it,同时y是x的父亲,这样的话如果不迭代就会漏掉

    代码:

    1. #include
    2. using namespace std;
    3. int fa[200005],sz[200005];
    4. set<int>to[200005],fr[200005];
    5. int find(int x){
    6. return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
    7. }
    8. void merge(int x,int y){
    9. vectorint,int>>vc;
    10. x=find(x),y=find(y);
    11. if(x==y)return;
    12. if(to[x].size()>to[y].size())swap(x,y);
    13. sz[y]+=sz[x];
    14. fa[x]=y;
    15. for(set<int>::iterator it=to[x].begin();it!=to[x].end();++it){
    16. to[y].insert(*it);
    17. fr[*it].erase(x);
    18. fr[*it].insert(y);
    19. if(fr[*it].size()==1)vc.push_back({*it,y});
    20. }
    21. for(int i=0;isize();i++)merge(vc[i].first,vc[i].second);
    22. }
    23. int main()
    24. {
    25. int T;cin>>T;int cou=1;
    26. while(T--){
    27. int n;cin>>n;
    28. for(int i=1;i<=n;i++){sz[i]=1;fa[i]=i;to[i].clear();fr[i].clear();}
    29. for(int i=1;i<=n;i++){
    30. int x,bi;cin>>x;
    31. for(int j=1;j<=x;j++){
    32. cin>>bi;to[bi].insert(i);fr[i].insert(bi);
    33. }
    34. }
    35. for(int i=1;i<=n;i++){
    36. if(fr[i].size()==1){merge(i,*fr[i].begin());}
    37. }
    38. int ans=0;
    39. for(int i=1;i<=n;++i){ans=max(ans,sz[i]);}
    40. cout<<"Case #"<": "<'\n';
    41. }
    42. return 0;
    43. }

    I-Chiitoitsu

    题意:

    手中有13张牌,要做7对子,起手的牌同一个花色最多2张牌,求做成的期望轮次。

    思路:

    设状态转移方程dp[i][j]表示摸牌次数,i是手中单牌的数量,j是牌山中剩余牌的数量。

    1.摸到的牌可以和手上的牌凑对,留下 其概率为:(i * 3) / j (因为手中有i张单牌,那么牌堆中每种单牌都有三张) ②

    2.摸到的牌不能和手上的牌凑对,丢掉 其概率为:(j - 3 * i) / j

    故 dp[i] [j] = 1 + (3 * i) / j * dp[i - 2][j - 1] + (j - 3 * i) / j * dp[i] [j - 1]

    期望=可能性*数量

    指增加了一次摸牌次数,如果留下,则加上(3 * i) / j * dp[i - 2][j - 1],若丢弃,则(j - 3 * i) / j * dp[i] [j - 1]

    初始化:

    只有一张牌没有凑齐了,要么我拿到了,次数加一,要么没拿到,期望加上 (i-3)/3*dp[1][i-1] 

    故 dp[1][i]=1+(i-3)/3*dp[1][i-1] ;

    代码:

    1. #include
    2. using namespace std;
    3. #define int long long
    4. #define ll long long
    5. const int mod=1e9+7;
    6. int dp[20][200];
    7. int T;
    8. ll ksm(ll a,ll k,ll mod)
    9. {
    10. ll res = 1;
    11. while(k){
    12. if(k & 1) res = res * a % mod;
    13. k >>= 1;
    14. a = a * a % mod;
    15. }
    16. return res;
    17. }
    18. signed main ()
    19. {
    20. for(int i=3;i<=123;i++){
    21. dp[1][i]=(1+(i-3)*ksm(i,mod-2,mod)%mod*dp[1][i-1])%mod;
    22. }
    23. for(int i=3;i<=13;i+=2){
    24. for(int j=3;j<=123;j++){
    25. dp[i][j]=(1+3*i*ksm(j,mod-2,mod)%mod*dp[i-2][j-1]%mod
    26. +(j-3*i)*ksm(j,mod-2,mod)%mod*dp[i][j-1]%mod)%mod;
    27. }
    28. }
    29. cin >> T;
    30. for (int _= 1; _<= T; _++){
    31. unordered_mapint> mp;
    32. string s;cin >> s;
    33. int n = 0;
    34. for(int i = 0;i < s.length();i += 2){
    35. string tmp = "";
    36. tmp += s[i];
    37. tmp += s[i + 1];
    38. mp[tmp] ++;
    39. }
    40. for(int i = 0;i < s.length();i += 2){
    41. string tmp = "";
    42. tmp += s[i];
    43. tmp += s[i + 1];
    44. if(mp[tmp] == 1) n ++;
    45. }
    46. cout << "Case #" <<_<< ": " << dp[n][123] << '\n';
    47. }
    48. }

    队友做了B、E,但我还没看

  • 相关阅读:
    手机界面设计中12种常用布局 优漫动游
    Webpack搭建简单的TypeScript脚手架
    Stable Diffusion 最新Ebsynth Utility脚本生成AI动画视频
    深度图(Depth Map)
    nuxt3入门
    Mysql 数据库开发简介与选择
    Docker 入门流程
    UE4自动打包工具编写
    OCR文字识别软件对于硬件的哪方面需求较高?
    Jmeter如何设置中文版
  • 原文地址:https://blog.csdn.net/zy98zy998/article/details/126535789