• 10.21测试


    QAQ(蒟蒻一枚),居然全打暴力。

      T1能看出来是DP,但实在想不到那个奇技淫巧,果断暴搜(20)。

      T2应该比较简单,写完正解跟暴力对拍,错了QAQ,直接交了暴力。

      T3压根没往floyd想,交暴力。

    T1(cogs 1292.打砖块)

    暴力:

     1 #include<cstdio>
     2 #include<iostream>
     3 #define mysister
     4 using namespace std;
     5 const int maxn=50;
     6 int read(){
     7     int x=0,f=1;char ch=getchar();
     8     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     9     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    10     return x*f;
    11 }
    12 void Emine(){
    13     freopen("brike.in","r",stdin);
    14     freopen("brike.out","w",stdout);
    15 }
    16 int n,m,a[maxn][maxn],ans=0,vis[maxn][maxn];
    17 void dfs(int cc,int aa,int bb){
    18     if(cc==m){
    19           int anss=0;
    20           for(int i=0;i<n;++i)
    21             for(int j=0;j<n-i;++j)
    22                   if(vis[i][j])
    23                     anss+=a[i][j];
    24           ans=max(anss,ans);
    25           return;
    26     }
    27     if(bb>=n-aa||aa>=n) return;
    28     for(int i=bb;i<n-aa;++i)
    29         if(aa==0||(vis[aa-1][i]&&vis[aa-1][i+1])){
    30               vis[aa][i]=1;
    31               dfs(cc+1,aa,i+1);dfs(cc+1,aa+1,0);
    32               vis[aa][i]=0;
    33         }
    34 }
    35 int main(){
    36     Emine();
    37     n=read(),m=read();
    38     for(int i=0;i<n;++i)
    39           for(int j=0;j<n-i;++j)
    40             a[i][j]=read();
    41     dfs(0,0,0);
    42     printf("%d
    ",ans);
    43     return 0;
    44 }
    View Code

    正解:

     1 //f[i][j][k]表示截止到第i行,总共已经选j个砖块,其中第i行已经选了前k个砖块的最大值。
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 #define maxn 55
     7 using namespace std;
     8 void Emine(){
     9     freopen("brike.in","r",stdin);
    10     freopen("brike.out","w",stdout);
    11 }
    12 int n,m,v[maxn][maxn],s[maxn],sum[maxn][maxn],ans,f[maxn][10*maxn][maxn];
    13 int main(){
    14     Emine();
    15     scanf("%d%d",&n,&m);
    16     for(int i=1;i<=n;i++)for(int j=i;j<=n;j++) scanf("%d",&v[j][i]);
    17     for(int i=1;i<=n;i++)for(int j=1;j<=i;j++) sum[i][j]=sum[i][j-1]+v[i][j];
    18     for(int i=1;i<=n;i++) s[i]=s[i-1]+i;
    19     memset(f,-333,sizeof(f)); f[0][0][0]=0;
    20     for(int i=1;i<=n;i++){//截止到第i行
    21         for(int j=0;j<=min(m,s[i]);j++){//总共已经选j个砖块
    22             for(int k=0;k<=min(i,j);k++){//第i行已经选了前k个砖块
    23                 for(int p=max(k-1,0);p<i&&s[p]<=j-k;p++)
    24                     f[i][j][k]=max(f[i][j][k],f[i-1][j-k][p]+sum[i][k]);
    25                 ans=max(ans,f[i][j][k]);
    26             }
    27         }
    28     }
    29     printf("%d
    ",ans);
    30     return 0; 
    31 }
    View Code

    T2(luogu 1631.序列合并)

    暴力:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<vector>
     7 #define ll long long
     8 using namespace std;
     9 priority_queue<ll,vector<ll>,greater<ll> > q;
    10 int n;ll a[100005],b[100005];
    11 int main(){
    12     scanf("%d",&n);
    13     for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    14     for(int i=1;i<=n;i++)scanf("%lld",&b[i]);
    15     for(int i=1;i<=n;i++)
    16         for(int j=1;j<=n;j++)
    17             q.push(a[i]+b[j]);
    18     for(int i=1;i<=n;i++){
    19         printf("%lld ",q.top());
    20         q.pop();
    21     }
    22     return 0;
    23 }
    View Code

    正解:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<queue>
     4 #include<algorithm>
     5 #define maxn 100005
     6 using namespace std;
     7 int a[maxn],b[maxn],ans[maxn];
     8 priority_queue <int> q;
     9 int main(){
    10     int n;cin>>n;
    11     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    12     for(int i=1;i<=n;i++){
    13         scanf("%d",&b[i]);
    14         q.push(b[i]+a[1]);
    15     }
    16     for(int i=1;i<=n;i++)
    17         for(int j=2;j<=n;j++){
    18             int temp=b[i]+a[j];
    19             if(temp>q.top()) break;
    20             else{
    21                 q.pop();
    22                 q.push(temp);
    23             }
    24         }
    25     for(int i=1;i<=n;i++){
    26         ans[n-i+1]=q.top();
    27         q.pop();
    28     }
    29     for(int i=1;i<=n;i++)
    30         cout<<ans[i]<<" ";
    31     return 0;
    32 }
    View Code

    T3(cogs 501.最小密度路径)

    暴力:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 using namespace std;
     6 int cnt,n,m,x,y,q,next[100001],last[100001],to[100001],cost[100001],b[101][101];
     7 double ans,a[101][101];
     8 int read(){
     9     int x=0,f=1;char ch=getchar();
    10     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    11     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    12     return x*f;
    13 }
    14 void Emine(){
    15     freopen("path.in","r",stdin);
    16     freopen("path.out","w",stdout);
    17 }
    18 void dfs(int num,int sum,int len){
    19       if(num==y){
    20           if((double)sum/(double)len<ans) ans=(double)sum/(double)len;
    21           return ;
    22     }
    23       int t=last[num];
    24       while(t){
    25           dfs(to[t],sum+cost[t],len+1);
    26           t=next[t];
    27     }
    28 }
    29 int main(){
    30     Emine();
    31       n=read(),m=read();
    32       for(int i=1;i<=m;i++){
    33           x=read(),y=read();
    34           next[++cnt]=last[x],last[x]=cnt,to[cnt]=y,cost[cnt]=read();
    35     }
    36       scanf("%d",&q);
    37       while(q--){
    38           x=read(),y=read(),ans=100002;
    39           if(!b[x][y]){
    40              dfs(x,0,0);
    41              a[x][y]=ans,b[x][y]=1;
    42         }
    43           else ans=a[x][y];
    44           if(ans>=100002) printf("OMG!
    ");
    45           else printf("%.3lf
    ",ans);
    46     }
    47     return 0;
    48 }
    View Code

    正解:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define maxn 55
     6 #define maxm 1005
     7 #define inf 0x3f3f3f3f
     8 using namespace std;
     9 int d[maxn][maxn][maxn],n,m,q;
    10 double ans[maxn][maxn];
    11 void Emine(){
    12     freopen("path.in","r",stdin);
    13     freopen("path.out","w",stdout);
    14 }
    15 int main(){
    16     Emine();
    17     scanf("%d%d",&n,&m);
    18     memset(d,inf,sizeof(d));
    19     for(int i=1;i<=m;i++){
    20         int u,v,w;scanf("%d%d%d",&u,&v,&w);
    21         d[u][v][1]=min(d[u][v][1],w);
    22     }
    23     for(int t=2;t<=n;t++)
    24         for(int k=1;k<=n;k++)
    25             for(int i=1;i<=n;i++)
    26                 for(int j=1;j<=n;j++){
    27                     if(d[i][k][t-1]==inf||d[k][j][1]==inf) continue;
    28                     d[i][j][t]=min(d[i][j][t],d[i][k][t-1]+d[k][j][1]);
    29                 }
    30     for(int i=1;i<=n;i++)
    31         for(int j=1;j<=n;j++){
    32             ans[i][j]=inf;
    33             if(i==j){ans[i][j]=0;continue;}
    34             for(int k=1;k<=n;k++) ans[i][j]=min(ans[i][j],(double)d[i][j][k]/(double)k);
    35         }
    36     scanf("%d",&q);
    37     while(q--){
    38         int u,v;scanf("%d%d",&u,&v);
    39         if(ans[u][v]>=1e6) printf("OMG!
    ");  //被坑QAQ,最大密度为最大边权w/1==1e6; 
    40         else printf("%.3lf
    ",ans[u][v]);
    41     }
    42     return 0;
    43 }
    View Code
  • 相关阅读:
    自己写的一些公共js方法
    node(03)--利用 HTTP 模块 URl 模块 PATH 模块 FS 模块创建一个 WEB 服务器
    node(03 fs文件模块)
    node (02 CommonJs 和 Nodejs 中自定义模块)顺便讲讲module.exports和exports的区别 dependencies 与 devDependencies 之间的区别
    node.js (01http 模块 url 模块)
    Ubuntu 16.04 下python2和python3及对应的pip的方法
    MySQL划重点-查询-聚合
    MySQL划重点-查询-条件
    MySQL命令
    使用Navicat for Mysql连接装在虚拟机Ubuntu16.04上的mysql服务器
  • 原文地址:https://www.cnblogs.com/Emine/p/7706322.html
Copyright © 2020-2023  润新知