• UVA 1611 Crane


    题意:

      输入一个1-n的排列,要求经过操作将其变换成一个生序序列。操作的规则如下每次操作时,可以选一个长度为偶数的连续区间,交换前一半和后一半。

    分析:  

      假设操作到第i个位置,而i这个数刚好在pos这个位置上,现在就要判断一下能否直接将pos上的i经过操作调到i这个位置上。如果 i + (pos - i) * 2 - 1 <= n 就表示可以一次操作完成。在上面条件不成立的情况下,又分为两种情况:一种是pos和i的距离是奇数的情况:那么就直接将[i,pos]这个区间的值进行交换即可。另一种是距离为偶数的情况,那就把[i+1,pos]这个区间的值进行交换即可

    代码:

      

    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include <vector>
    #include <queue>
    #include <cmath>
    #include <algorithm>
    #include <set>
    #include <string>
    using namespace std;
    const int maxn = 17010;
    int n, num, pos, C;
    int r[maxn];
    bool flag;
    double tmp;
    double x[5], a[maxn][10];
    int main()
    {
    while (~scanf("%d",&n), n)
    {
    int i,j;
    flag=true;
    memset(a,0,sizeof(a));
    for (i = 0;i<n;++i)
    {
    scanf("%lf%lf%lf",&x[0],&x[1],&x[2]);
    for (j=0;j<8;++j)
    {
    num=j;
    pos=0;
    while(num)
    {
    if(num&1)
    a[i][j]+=x[pos];
    num>>=1;
    ++pos;
    }
    }
    sort(a[i],a[i]+8);
    }
    for(i=0;i<n;++i)
    scanf("%d",&r[i]);
    tmp=a[r[0]-1][7];
    for (i=1;i<n;++i)
    {
    if(r[i]>r[i - 1])
    {
    for(j=7;j>=0;--j)
    if (a[r[i]-1][j]<=tmp+1e-6)
    {
    tmp=a[r[i]-1][j];
    break;
    }
    }
    else
    {
    flag=false;
    for(j=7;j>=0;--j)
    {
    if(fabs(a[r[i]-1][j]-tmp)<1e-6)
    continue;
    else if(a[r[i]-1][j]<tmp)
    {
    tmp=a[r[i]-1][j];
    flag=true;
    break;
    }
    }
                    if(!flag)
    break;
    }
    }
    printf("Case %d: ",++C);
    if (flag)
    printf("%.2lf ",tmp);
    else
    printf("No solution ");
    }
    return 0;
    }

      

  • 相关阅读:
    vba的单元格引用的总结
    为IE窗口添加菜单实例
    给SQLServer2000升级遇到的问题
    图片上传问题(含网页图片预览)
    javascript小技巧【待续】
    成功部署JSP网站的经验总结
    VBA实例
    为JDK增加新的jar包
    理解绝对定位和相对定位布局
    资源收集
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4928541.html
Copyright © 2020-2023  润新知