zoukankan      html  css  js  c++  java
  • Codeforces 337

    A:

    题意不知道,似乎是排序。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxn=60;
     9 
    10 int n,m,z[maxn];
    11 
    12 int main()
    13 {
    14     scanf("%d%d",&n,&m);
    15     for (int a=1;a<=m;a++)
    16         scanf("%d",&z[a]);
    17     sort(z+1,z+m+1);
    18     int ans=z[n]-z[1];
    19     for (int a=n+1;a<=m;a++)
    20         ans=min(ans,z[a]-z[a-n+1]);
    21     printf("%d
    ",ans);
    22 
    23     return 0;
    24 }
    View Code

    B:

    题意是给你一个图片横竖比和一个屏幕横竖比,问最后最少剩下多少的剩余空间。

    算一算是横着顶满还是竖着顶满就行了。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 int a,b,c,d;
     9 
    10 int gcd(int a,int b)
    11 {
    12     if (!b) return a;
    13     else return gcd(b,a%b);
    14 }
    15 
    16 int main()
    17 {
    18     scanf("%d%d%d%d",&a,&b,&c,&d);
    19     if (a*d<b*c) swap(a,b),swap(c,d);
    20     int v1=b*c;
    21     int v2=a*d;
    22     int g=gcd(v1,v2);
    23     v1/=g;
    24     v2/=g;
    25     printf("%d/%d
    ",v2-v1,v2);
    26 
    27     return 0;
    28 }
    View Code

    C:

    答对一题得1分,连续答对k次翻倍,给出题目数和答对了多少题,问少得多少分。

    每K次分为一段,每段答对K-1道题,如果还有剩余的答对题数,则尽量往前面补空,用矩阵推出答案即可。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 #define inc(a,b) {a+=b;if (a>=mo) a-=mo;}
     9 
    10 const int mo=1000000009;
    11 
    12 int n,m,k,m1[3],m2[3][3],m3[3],m4[3][3];
    13 
    14 int main()
    15 {
    16     scanf("%d%d%d",&n,&m,&k);
    17     int rest=m-(n%k+n/k*(k-1));
    18     rest=max(rest,0);
    19     m1[1]=0;m1[2]=2*k;
    20     m2[1][1]=2;m2[1][2]=0;
    21     m2[2][1]=1;m2[2][2]=1;
    22     while (rest)
    23     {
    24         if (rest&1)
    25         {
    26             memset(m3,0,sizeof(m3));
    27             for (int a=1;a<=1;a++)
    28                 for (int b=1;b<=2;b++)
    29                     for (int c=1;c<=2;c++)
    30                         inc(m3[c],(long long)m1[b]*m2[b][c]%mo);
    31             for (int a=1;a<=2;a++)
    32                 m1[a]=m3[a];
    33         }
    34         memset(m4,0,sizeof(m4));
    35         for (int a=1;a<=2;a++)
    36             for (int b=1;b<=2;b++)
    37                 for (int c=1;c<=2;c++)
    38                     inc(m4[a][c],(long long)m2[a][b]*m2[b][c]%mo);
    39         for (int a=1;a<=2;a++)
    40             for (int b=1;b<=2;b++)
    41                 m2[a][b]=m4[a][b];
    42         rest>>=1;
    43     }
    44     int ans=m1[1];
    45     rest=m-(n%k+n/k*(k-1));
    46     rest=max(rest,0);
    47     rest=m-rest*k;
    48     inc(ans,rest);
    49     printf("%d
    ",ans);
    50 
    51     return 0;
    52 }
    View Code

    D:

    告诉你某些结点被污染了,并且污染源的可污染距离不超过某个值,问可能为污染源的点。

    枚举结点,维护被污染结点到其距离的最大值。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 const int maxn=100010;
     9 
    10 int n,m,d,en,ans,f[maxn][2];
    11 
    12 bool ins[maxn];
    13 
    14 struct edge
    15 {
    16     int e;
    17     edge *next;
    18 }*v[maxn],ed[maxn<<1];
    19 
    20 void add_edge(int s,int e)
    21 {
    22     en++;
    23     ed[en].next=v[s];v[s]=ed+en;v[s]->e=e;
    24 }
    25 
    26 void dfs(int now,int pre)
    27 {
    28     for (edge *e=v[now];e;e=e->next)
    29         if (e->e!=pre) dfs(e->e,now);
    30     f[now][0]=f[now][1]=-1;
    31     for (edge *e=v[now];e;e=e->next)
    32         if (e->e!=pre)
    33         {
    34             int v=f[e->e][0];
    35             if (v!=-1) v++;
    36             if (ins[e->e]) v=max(v,1);
    37             if (v!=-1)
    38             {
    39                 if (v>=f[now][0]) f[now][1]=f[now][0],f[now][0]=v;
    40                 else
    41                 {
    42                     if (v>=f[now][1]) f[now][1]=v;
    43                 }
    44             }
    45         }
    46 }
    47 
    48 void solve(int now,int pre,int pred)
    49 {
    50     if (f[now][0]<=d && pred<=d) ans++;
    51     for (edge *e=v[now];e;e=e->next)
    52         if (e->e!=pre)
    53         {
    54             int v=pred;
    55             if (v!=-1) v++;
    56             if (ins[now]) v=max(v,1);
    57             int nd=f[e->e][0];
    58             if (nd==-1) 
    59             {
    60                 if (ins[e->e]) nd=1;
    61             }
    62             else nd++;
    63             if (nd==f[now][0])
    64             {
    65                 if (f[now][1]!=-1) v=max(v,f[now][1]+1);
    66             }
    67             else
    68             {
    69                 if (f[now][0]!=-1) v=max(v,f[now][0]+1);
    70             }
    71             solve(e->e,now,v);
    72         }
    73 }
    74 
    75 int main()
    76 {
    77     scanf("%d%d%d",&n,&m,&d);
    78     for (int a=1;a<=m;a++)
    79     {
    80         int p;
    81         scanf("%d",&p);
    82         ins[p]=true;
    83     }
    84     for (int a=1;a<n;a++)
    85     {
    86         int s,e;
    87         scanf("%d%d",&s,&e);
    88         add_edge(s,e);
    89         add_edge(e,s);
    90     }
    91     dfs(1,0);
    92     solve(1,0,-1);
    93     printf("%d
    ",ans);
    94 
    95     return 0;
    96 }
    View Code

    E:

    告诉你n个必须在因子数上出现的数,问最小所需要的结点数。

    爆搜。hza说状压但我不会。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<algorithm>
     5 
     6 using namespace std;
     7 
     8 int n,ans=0x3f3f3f3f,v[10],vx[10];
     9 
    10 long long z[10],y[10];
    11 
    12 bool prime[10];
    13 
    14 int calc(long long b)
    15 {
    16     int ans=0;
    17     for (long long a=2;a*a<=b;a++)
    18         while (b%a==0)
    19             ans++,b/=a;
    20     if (b!=1) ans++;
    21     return ans;
    22 }
    23 
    24 void dfs(int now,int nownum,int cnt)
    25 {
    26     if (nownum>=ans) return;
    27     if (now>n)
    28     {
    29         if (cnt>=2) nownum++;
    30         ans=min(ans,nownum);
    31         return;
    32     }
    33     for (int a=now+1;a<=n;a++)
    34         if (y[a]%z[now]==0)
    35         {
    36             y[a]/=z[now];
    37             vx[a]-=v[now];
    38             dfs(now+1,nownum+vx[now]+(prime[now]!=true),cnt);
    39             y[a]*=z[now];
    40             vx[a]+=v[now];
    41         }
    42     dfs(now+1,nownum+vx[now]+(prime[now]!=true),cnt+1);
    43 }
    44 
    45 int main()
    46 {
    47     scanf("%d",&n);
    48     for (int a=1;a<=n;a++)
    49         scanf("%I64d",&z[a]);
    50     sort(z+1,z+n+1);
    51     for (int a=1;a<=n;a++)
    52         y[a]=z[a];
    53     for (int a=1;a<=n;a++)
    54     {
    55         v[a]=vx[a]=calc(z[a]);
    56         if (v[a]==1) prime[a]=true;
    57     }
    58     dfs(1,0,0);
    59     printf("%d
    ",ans);
    60 
    61     return 0;
    62 }
    View Code
  • 相关阅读:
    89组合margin、padding、float、clear问题
    absoulue与relative配合定位盒子居中问题
    11种常用css样式之表格和定位样式学习
    11种常用css样式之鼠标、列表和尺寸样式学习
    C++走向远洋——54(项目一2、分数类的重载、取倒数)
    C++走向远洋——53(项目一1、分数类的重载、加减乘除、比较)
    HTML标签学习总结(1)
    9——PHP循环结构foreach用法
    C++走向远洋——52(十三周阅读程序)
    我为什么要用CSDN博客?
  • 原文地址:https://www.cnblogs.com/zhonghaoxi/p/3294237.html
Copyright © 2011-2022 走看看