【LGR-047】洛谷5月月賽
這次我期待了很久的Luogu賽制崩掉了
傳說中的Luogu神機就這樣被卡爆了
然後我過了20min才登上Luogu的網站,30min後才看到題目
然後交T1TM的不給我測!!!然後又叫了一次機子就炸了,好幾個點都不測
然後感覺遊戲體驗極差。交了一波T2又有一個點不給我測,還莫名T了幾個點這機子真的
然後就直接關掉睡覺去了
不過說實話題目還是很好的,值得深思一下
A: T29693 取石子
這道題目還是很良心的,水的一批
首先註意到因為a[0]=0,因此只要石子沒取光就一定可以繼續取
然後判斷一下Σa[i]的奇偶性即可
CODE
#include<cstdio> using namespace std; int x,n; long long tot; inline char tc(void) { static char fl[100000],*A=fl,*B=fl; return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x) { x=0; char ch=tc(); while (ch<‘0‘||ch>‘9‘) ch=tc(); while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=tc(); } int main() { //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout); register int i; read(n); for (i=1;i<=n;++i) read(x),tot+=x; puts(tot%2?"Alice":"Bob"); return 0; }
B: T30204 偷上網
這道題還是比較歐洲玄學的
首先當n=1時,半徑為l,因此我們枚舉一下四個角落是否滿足條件即可,否則輸出GG
當n>=2時,由於圓的面積絕對小於正方形的面積,所以一定有解
但是怎麽找到那個解呢?
rand大法好,我們直接上rand判斷是否可行即可
雖然有大佬給出證明n>=2時在邊上一定能找到點,但是這裏rand真心快,全部0ms卡過去了,所以也沒去打別的算法了
randCODE
#include<cstdio> #include<cstdlib> #include<ctime> #include<cmath> using namespace std; typedef double DB; const int N=15; const DB EPS=1e-6; int n,l; DB x[N],y[N]; inline DB calc(DB a,DB b,DB c,DB d) { return sqrt((a-c)*(a-c)+(b-d)*(b-d)); } inline void sp_work(int l) { if (calc(0.0,0.0,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",0.0,0.0); exit(0); } if (calc(0.0,(DB)l,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",0.0,(DB)l); exit(0); } if (calc((DB)l,0.0,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",(DB)l,0.0); exit(0); } if (calc((DB)l,(DB)l,x[1],y[1])>=(DB)l/n+EPS) { printf("%.3lf %.3lf",(DB)l,(DB)l); exit(0); } puts("GG"); return; } inline void com_work(int l) { for (;;) { DB a=rand()%l+(DB)(rand()%1000)/1000,b=rand()%l+(DB)(rand()%1000)/1000; bool flag=1; for (register int i=1;i<=n;++i) if (calc(a,b,x[i],y[i])<(DB)l/n+EPS) { flag=0; break; } if (flag) { printf("%.3lf %.3lf",a,b); exit(0); } } } int main() { srand(time(0)); register int i; scanf("%d%d",&n,&l); for (i=1;i<=n;++i) scanf("%lf%lf",&x[i],&y[i]); if (n==1) sp_work(l); else com_work(l); return 0; }
C: T28881 粘骨牌
這是一道比較需要思維的題目了
首先我們先來考慮GG的情況,這個很簡單,除非起點就是特殊點,要不然不可能會GG
這個還是很簡單的,因為就算其他點都是特殊點,我大不了把所有骨牌都固定住,這樣其他點就露不出來了
然後我們考慮建邊,對於所有的點,我們向它有可能可以到達的點建邊,邊權就是固定這個骨牌的代價
然後我們簡單分析一下,就可以發現這是一棵樹,因為每一個骨牌都可以連出兩條邊,並且不可能有環
然後就要求最小的代價割掉所有點,所以我們考慮樹形DP
設f[x]表示割掉x及其所有字數中的特殊點的最小代價,則
f[x]=v[fa[x]][x] (if x is a special node)
f[x]=Σmin(v[x][son[x]],f[son[x]]) ( if x is a common node)
然後我們發現這個建圖可以和DP的過程一起寫成一個類似記搜的方法,然後剛上去就可以了
CODE
#include<cstdio>
using namespace std;
const int N=1005,fx[4]={0,1,0,-1},fy[4]={1,0,-1,0};
int a[N][N],c[N*N],n,m,k,t,x,y,s_x,s_y;
bool sp[N][N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch=tc();
while (ch<‘0‘||ch>‘9‘) ch=tc();
while (ch>=‘0‘&&ch<=‘9‘) x=x*10+ch-‘0‘,ch=tc();
}
inline long long min(long long a,long long b)
{
return a<b?a:b;
}
inline bool check(int x,int y)
{
return x>=1&&x<=n&&y>=1&&y<=m;
}
inline long long DFS(int x,int y)
{
long long ans=0;
for (register int i=0;i<4;++i)
{
int xx=x+fx[i]*2,yy=y+fy[i]*2;
if (check(xx,yy)&&a[x+fx[i]][y+fy[i]]==a[xx][yy])
{
if (sp[xx][yy]) ans+=c[a[xx][yy]]; else ans+=min(DFS(xx,yy),c[a[xx][yy]]);
}
}
return ans;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i,j;
read(n); read(m); read(k); t=n*m-1>>1;
for (i=1;i<=t;++i)
read(c[i]);
for (i=1;i<=k;++i)
read(x),read(y),sp[x][y]=1;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
{
read(a[i][j]);
if (!a[i][j]) s_x=i,s_y=j;
}
if (sp[s_x][s_y]) puts("GG"); else printf("%lld",DFS(s_x,s_y));
return 0;
}
D: T30208 太極劍&&E: T30212 玩遊戲
這兩題還是太難了,自己看題解也看不懂吧
留這以後填
【LGR-047】洛谷5月月賽