1. 程式人生 > >Codeforces Round 492 (Div.1)

Codeforces Round 492 (Div.1)

stream 每次 %d fine lse break str for inpu

大概這一場考的還算可以吧..

上來剛A...然後A死難寫...

然後B是水題..

C猜了個結論錯掉了,也找到了反例

然後後面幹脆的直接把數據random_shuffle以後再跑這個貪心...

就過了...

D..

感謝Q巨...

Q巨猜了個結論讓我交了一發..

然後過了...

========================================================

A題

給你一個4*n的網格圖,第一行第四行是停車場

第二行第三行是過道

技術分享圖片

現在一共有k輛車(編號1~k)停在過道上,你需要把它們挪到正確的位置上

你一旦將一輛車停入停車區,就不可以移動它,也就是說你必須讓正確的車進入正確的位置

求一個20000步以內的方案,n<=50,k<=2n

做法;

你可以考慮,整個2*n的區域直接把它變成一個環,

例如上圖

把它變成

1->2->0->4

^ |

| v

5<-0<-0<-3

的一個環,然後在這個環上每次移動一個車,順便把前面所有的車都往前推一格(或者推進目的地)

時間復雜度O(100*99+100) 99表示最多移動99下才能到目的地(這個環上)

我們就一直讓它轉直到所有車都到目的地

(如果位置是滿的,而且一開始沒有車可以到目的地,輸出-1)

實現的時候不是這麽寫的..而是把每個沒到終點的都往終點推...

B題

2n個數,1~n各出現2次

每次可以交換兩個連續的數

問幾次能讓每個數出現的兩次是連續的

n<=100

直接...暴力把跟第一個相同的拖到第二個....然後依次做下去...

C題

n個向量,長度<=1e6

每個向量可以選擇+1或者-1倍,要求

最後向量的和加起來長度<=1.5*1e6

我的做法:

直接每次讓當前向量和下一個合並,取小的那一個

如果最後發現錯了,就把數據random_shuffle一下,再做一次,直到做出來為止

過了,雖然不知道為啥

std做法:

每次三個裏面,肯定有兩個(可能經過乘以-1後)會有一對成為一個120°以外的角

那麽兩個<=1e6的向量加起來還在1e6以內

那麽最後就可以得到兩個,加起來一定在1.5*1e6(實際上在sqrt(2)*1e6)以內

D題:

A和B在玩一個遊戲

它們在填一個n位的二進制數,每次隨機一個人過來選一位填成0或者1

最後得分是c[二進制數數值]

A要讓它盡量大,B要讓它盡量小

問期望得到的值是多少,然後接下來r次修改

每次修改c數組裏面一個數的值,然後再詢問

n<=18

r<=218

做法:

直接所有的c的和然後除以2^n

Q老師的結論...

EF不會做

A

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define move moasudoasjsap
int a[4][55];
struct move
{
    int id;
    int x;
    int y;
    move (int iid=0,int xx=0,int yy=0)
    {
        id=iid;
        x=xx+1;
        y=yy+1;
    }
    void output()
    {
        printf("%d %d %d\n",id,x,y);
    }
};
vector<move> ans;
bool vis[105];
int n;
int newx,newy;
void find_next(int sx,int sy)
{
    newx=sx;
    newy=sy;
    if (sx==1)
    {
        if (sy==0)
        {
            newx++;
        }
        else
        {
            newy--;
        }
    }
    else
    {
        if (sy==n-1)
        {
            newx--;
        }
        else
        {
            newy++;
        }
    }
}
void find_way(int sx,int sy,int tx,int ty,int id)
{
    if ((sx==tx)&&(sy==ty)) return;
    find_next(sx,sy);
    int ttx=newx;
    int tty=newy;
    if (a[newx][newy]!=0)
    {
        if (a[ttx^1][tty]==a[ttx][tty])
        {
            ans.push_back(move(a[ttx][tty],ttx^1,tty));
            vis[a[ttx][tty]]=true;
            a[ttx][tty]=0;
        }
        else
        {
            find_next(ttx,tty);
            find_way(ttx,tty,newx,newy,a[ttx][tty]);
        }
    }
    ans.push_back(move(id,ttx,tty));
    a[ttx][tty]=id;
    a[sx][sy]=0;
    find_way(ttx,tty,tx,ty,id);
}
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int k;
    scanf("%d%d",&n,&k);
    int i;
    for (i=0;i<4;i++)
    {
        int j;
        for (j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    if (k==n+n)
    {
        for (i=1;i<=2;i++)
        {
            int j;
            for (j=0;j<n;j++)
            {
                if (a[i][j]==a[i^1][j])
                {
                    ans.push_back(move(a[i][j],i^1,j));
                    vis[a[i][j]]=true;
                    a[i][j]=0;
                    break;
                }
            }
            if (j!=n) break;
        }
        if (i==3)
        {
            puts("-1");
            return 0;
        }
    }
    for (i=1;i<=k;i++)
    {
        if (vis[i]) continue;
        int j;
        int final_x,final_y;
        int start_x,start_y;
        for (j=0;j<n;j++)
        {
            if (a[0][j]==i)
            {
                final_x=1;
                final_y=j;
            }
            if (a[3][j]==i)
            {
                final_x=2;
                final_y=j;
            }
            if (a[1][j]==i)
            {
                start_x=1;
                start_y=j;
            }
            if (a[2][j]==i)
            {
                start_x=2;
                start_y=j;
            }
        }
        find_way(start_x,start_y,final_x,final_y,i);
        ans.push_back(move(i,final_x^1,final_y));
        a[final_x][final_y]=0;
        vis[i]=true;
    }
    printf("%d\n",ans.size());
    for (i=0;i<ans.size();i++)
    {
        ans[i].output();
    }
    return 0;
} 

B

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n;
    scanf("%d",&n);
    int i;
    for (i=0;i<n+n;i++)
    {
        scanf("%d",&a[i]);
    }
    int ans=0;
    for (i=0;i<n+n;i+=2)
    {
        int j;
        for (j=i+1;j<n+n;j++)
        {
            if (a[i]==a[j])
            {
                int k;
                for (k=j;k>i+1;k--)
                {
                    swap(a[k],a[k-1]);
                    ans++;
                }
            }
        }
    }
    printf("%d\n",ans);
    return 0;
} 

C

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct vv
{
    int x;
    int y;
    int id;
};
vv v[100005];
int ans[100005];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    srand(time(0));
    int n;
    scanf("%d",&n);
    int nowx=0,nowy=0;
    int i;
    for (i=0;i<n;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        v[i].id=i;
        v[i].x=x;
        v[i].y=y;
        long long t1=(long long)(nowx-x)*(nowx-x)+(long long)(nowy-y)*(nowy-y);
        long long t2=(long long)(nowx+x)*(nowx+x)+(long long)(nowy+y)*(nowy+y);
        if (t1<t2)
        {
            ans[i]=-1;
            nowx-=x;
            nowy-=y;
        }
        else
        {
            ans[i]=1;
            nowx+=x;
            nowy+=y;
        }
    }
    if ((long long)nowx*nowx+(long long)nowy*nowy>(long long)1500000*1500000)
    {
        for (;;)
        {
            random_shuffle(v,v+n);
            int nowx=0,nowy=0;
            for (i=0;i<n;i++)
            {
                int x=v[i].x;
                int y=v[i].y;
                long long t1=(long long)(nowx-x)*(nowx-x)+(long long)(nowy-y)*(nowy-y);
                long long t2=(long long)(nowx+x)*(nowx+x)+(long long)(nowy+y)*(nowy+y);
                if (t1<t2)
                {
                    ans[v[i].id]=-1;
                    nowx-=x;
                    nowy-=y;
                }
                else
                {
                    ans[v[i].id]=1;
                    nowx+=x;
                    nowy+=y;
                }
            }
            if ((long long)nowx*nowx+(long long)nowy*nowy<=(long long)1500000*1500000)
            {
                for (i=0;i<n;i++)
                {
                    printf("%d ",ans[i]);
                }
                printf("\n");
                return 0;
            }
        }
    }
    for (i=0;i<n;i++)
    {
        printf("%d ",ans[i]);
    }
    printf("\n");
    return 0;
} 

D

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<math.h>
#include<time.h>
#include<vector>
#include<bitset>
#include<memory>
#include<utility>
#include<fstream>
#include<stdio.h>
#include<sstream>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[1<<18];
int main()
{
    #ifdef absi2011
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    #endif
    int n,r;
    scanf("%d%d",&n,&r);
    int k=(1<<n);
    int i;
    long long sum=0;
    for (i=0;i<k;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
    }
    printf("%.12lf\n",sum*1.0/k);
    for (i=0;i<r;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        sum-=a[x];
        a[x]=y;
        sum+=y;
        printf("%.12lf\n",sum*1.0/k);
    }
    return 0;
} 

Codeforces Round 492 (Div.1)