A:签到。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define ll long long int t,a,b,c,d; int main() { t=read(); while (t--) { a=read(),b=read(),c=read(),d=read(); cout<<a/d+1ll*a/d/b*c<<endl; } return 0; }
B:long long。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 100010 long long n,m; int main() { cin>>n>>m; cout<<max(n-m*2,0ll)<<' '; for (long long i=0;i<=n;i++) if (i*(i-1)/2>=m) {cout<<n-i;break;} return 0; }
C:从大到小排序后贪心地修改。我猜我是唯一一个C花掉的时间比D多的。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 200010 int n,m,a[N],ans=0; int main() { n=read(),m=read(); for (int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1);reverse(a+1,a+n+1); for (int i=1;a[i]!=a[n];) { int t=i;long long tot=0; while (t<n&&tot+1ll*(a[t]-a[t+1])*t<=m) tot+=(a[t]-a[t+1])*t,t++; ans++; i=t;a[i]-=(m-tot)/t; } cout<<ans; return 0; }
D:做法非常显然,每个位置拆点跑个最短路然后大力dp就行了,码农题。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() { int x=0,f=1;char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();} while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } #define N 12 int n,f[N*N][3],g[N*N][3],dis[N*N*3][N*N*3],dis2[N*N*3][N*N*3]; struct data{int x,y; }a[N*N]; int wx[8]={1,1,-1,-1,2,2,-2,-2},wy[8]={2,-2,2,-2,1,-1,1,-1}; int trans(int p,int x,int y){return p*n*n+(x-1)*n+y;} void getdis() { memset(dis,42,sizeof(dis));memset(dis2,42,sizeof(dis2)); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int x=1;x<=n;x++) for (int y=1;y<=n;y++) if (i==x||j==y) dis[trans(0,i,j)][trans(0,x,y)]=1,dis2[trans(0,i,j)][trans(0,x,y)]=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int k=0;k<8;k++) if (i+wx[k]>=1&&j+wy[k]>=1&&i+wx[k]<=n&&j+wy[k]<=n) dis[trans(1,i,j)][trans(1,i+wx[k],j+wy[k])]=1,dis2[trans(1,i,j)][trans(1,i+wx[k],j+wy[k])]=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int x=1;x<=n;x++) for (int y=1;y<=n;y++) if (i+j==x+y||i-j==x-y) dis[trans(2,i,j)][trans(2,x,y)]=1,dis2[trans(2,i,j)][trans(2,x,y)]=0; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) for (int x=0;x<3;x++) for (int y=0;y<3;y++) dis[trans(x,i,j)][trans(y,i,j)]=dis2[trans(x,i,j)][trans(y,i,j)]=(x!=y); for (int k=1;k<=3*n*n;k++) for (int i=1;i<=3*n*n;i++) for (int j=1;j<=3*n*n;j++) if (dis[i][k]+dis[k][j]<dis[i][j]||dis[i][k]+dis[k][j]==dis[i][j]&&dis2[i][k]+dis2[k][j]<dis2[i][j]) dis[i][j]=dis[i][k]+dis[k][j],dis2[i][j]=dis2[i][k]+dis2[k][j]; } void update(int i,int p) { for (int j=0;j<3;j++) if (f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]<f[i][p]|| f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]==f[i][p] &&g[i-1][j]+dis2[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]<g[i][p]) f[i][p]=f[i-1][j]+dis[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)], g[i][p]=g[i-1][j]+dis2[trans(j,a[i-1].x,a[i-1].y)][trans(p,a[i].x,a[i].y)]; } int main() { n=read(); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { int x=read(); a[x].x=i,a[x].y=j; } getdis(); memset(f,42,sizeof(f));memset(g,42,sizeof(g)); f[1][0]=f[1][1]=f[1][2]=g[1][0]=g[1][1]=g[1][2]=0; for (int i=2;i<=n*n;i++) update(i,0),update(i,1),update(i,2); int x=0; if (f[n*n][1]<f[n*n][0]||f[n*n][1]==f[n*n][0]&&g[n*n][1]<g[n*n][0]) x=1; if (f[n*n][2]<f[n*n][x]||f[n*n][2]==f[n*n][x]&&g[n*n][2]<g[n*n][x]) x=2; cout<<f[n*n][x]<<' '<<g[n*n][x]; return 0; }
然后就并没有时间看题了。不过E是置换并没有真的学过那大概也不算翻车了。
upd:于是就发现F是个傻逼题。将所有边连上缩个点dp一发即可。
result:rank 217 rating +7 迷之稳定。