补一场CF http://codeforces.com/contest/793
A
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=1e5+5;
int cost[MAXN];
int main()
{
int n,k,minn=1e9;long long ans=0;bool flag=false;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&cost[i]);
minn=min(minn,cost[i]);
}
for(int i=0;i<n;i++){
ans+=(cost[i]-minn)/k;
if((cost[i]-minn)%k){
flag=true;
break;
}
}
printf("%I64d\n",flag?-1:ans);
return 0;
}
B
没注意细节导致wa了
#include<cstdio>
#include<cstring>
using namespace std;
const int ox[]={0,0,-1,1};
const int oy[]={1,-1,0,0};
const int MAXN=1e3+1e2;
char mp[MAXN][MAXN];
int dp[MAXN][MAXN];
int n,m,sx,sy,ex,ey;
inline void dfs(int X,int Y,int o){
for(int i=0;i<4;i++){
int x=X+ox[i],y=Y+oy[i],now=(i==o?dp[X][Y]:dp[X][Y]+1);
if(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now<=dp[x][y]&&now<=2){
if(now<dp[x][y]){
dp[x][y]=now;
dfs(x,y,i);
continue;
}
while(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now==dp[x][y]){
x=x+ox[i],y=y+oy[i];
if(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now<dp[x][y]&&now<=2){
dp[x][y]=now;
dfs(x,y,i);
break;
}
}
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%s",mp[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='S'){
sx=i,sy=j;
}else if(mp[i][j]=='T'){
ex=i,ey=j;
mp[i][j]='.';
}
}
}
memset(dp,0x3f,sizeof(dp));
dp[sx][sy]=0;
for(int i=0;i<4;i++){
dfs(sx,sy,i);
}
puts(dp[ex][ey]<=2?"YES":"NO");
return 0;
}
C
EPS取 1e-20导致wa了,没仔细读题导致wa了,没考虑好边界情况wa了
(QAQ 我怎么这么弱
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=1e5+1e2;
double x1,x2,y1,y2;int n;
double x[MAXN],y[MAXN],vx[MAXN],vy[MAXN];
const double e=1.0;
const double EPS=1e-12;
double fabs(double a){
return a<0.0?-a:a;
}
void gett(int i,double &mint,double &maxt){
mint=1e9,maxt=-1e9;
double t;
if(x1<x[i]&&x[i]<x2&&y1<y[i]&&y[i]<y2){
mint=1e-9;
if(vx[i]==0.0&&vy[i]==0.0) maxt=1e12;
else if(vx[i]==0.0) maxt=max((y1-y[i])/vy[i],(y2-y[i])/vy[i]);
else if(vy[i]==0.0) maxt=max((x1-x[i])/vx[i],(x2-x[i])/vx[i]);
else maxt=min(max((y1-y[i])/vy[i],(y2-y[i])/vy[i]),max((x1-x[i])/vx[i],(x2-x[i])/vx[i]));
return ;
}
if(vx[i]==0.0&&vy[i]!=0.0&&(x[i]==x1||x[i]==x2)||
vy[i]==0.0&&vx[i]!=0.0&&(y[i]==y1||y[i]==y2)
) {mint=1e9; return;}
if(vx[i]!=0.0) t=e*(x1-x[i])/vx[i]; else t=0.0;
if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
mint=min(mint,t);
maxt=max(maxt,t);
}
if(vx[i]!=0.0) t=e*(x2-x[i])/vx[i]; else t=0.0;
if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
mint=min(mint,t);
maxt=max(maxt,t);
}
if(vy[i]!=0.0) t=e*(y1-y[i])/vy[i]; else t=0.0;
if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
mint=min(mint,t);
maxt=max(maxt,t);
}
if(vy[i]!=0.0) t=e*(y2-y[i])/vy[i]; else t=0.0;
if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
mint=min(mint,t);
maxt=max(maxt,t);
}
}
int main()
{
scanf("%d%lf%lf%lf%lf",&n,&x1,&y1,&x2,&y2);
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf",&x[i],&y[i],&vx[i],&vy[i]);
}
double mint=-1e9,maxt=1e12,tmpmint,tmpmaxt;
for(int i=0;i<n;i++){
gett(i,tmpmint,tmpmaxt);
mint=max(mint,tmpmint);
maxt=min(maxt,tmpmaxt);
}
if(mint>=maxt-EPS||mint<EPS) puts("-1");
else printf("%0.20f",mint);
return 0;
}
D
看了别人的思想,然后一直在调for。。。。不压缩代码了 方便理解
复杂度
O(k⋅n3)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=82;
int dp[MAXN][MAXN][MAXN],w[MAXN][MAXN],n,m,k;
int work(){
if(k==1) return 0;
for(int i=2;i<k;i++){
for(int j=0;j<=n+1;j++){
for(int u=j+1;u<=n+1;u++){
if(dp[i-1][j][u]!=INF){
for(int t=j+1;t<u;t++){
if(w[u][t]!=INF){
dp[i][u][t]=min(dp[i][u][t],dp[i-1][j][u]+w[u][t]);
dp[i][j][t]=min(dp[i][j][t],dp[i-1][j][u]+w[u][t]);
}
}
}
if(dp[i-1][u][j]!=INF){
for(int t=j+1;t<u;t++){
if(w[j][t]!=INF){
dp[i][j][t]=min(dp[i][j][t],dp[i-1][u][j]+w[j][t]);
dp[i][u][t]=min(dp[i][u][t],dp[i-1][u][j]+w[j][t]);
}
}
}
}
}
}
int res=INF;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
res=min(res,dp[k-1][i][j]);
}
}
return res;
}
int main()
{
memset(dp,0x3f,sizeof(dp));
memset(w ,0x3f,sizeof(w) );
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<m;i++){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
if(x==y) continue;
w[x][y]=dp[1][x][y]=min(w[x][y],c);
if(x<y) dp[1][n+1][y]=min(w[x][y],dp[1][n+1][y]);
else dp[1][0][y]=min(w[x][y],dp[1][0][y]);
}
int ans=work();
printf("%d\n",ans<INF?ans:-1);
return 0;
}