Codeforces Round 492 (Div.1)
大概這一場考的還算可以吧..
上來剛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)