Codeforces Beta Round #76 (Div. 1 Only)
无聊和欧阳一起比赛。。。
才发现差距是巨大的, 欧阳的思维+编程的速度比我快了3倍左右。 也就是一般的题 我a了一题, 他就可以a 3题。
加油吧, 菜鸟。
a. 题意是简单的,但是情况稍微一点多。。。 注意这些情况就可以了
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; int main() { int x,y; int x1,y1,x2,y2; int n,m,a,b; scanf("%d%d%d%d",&n,&m,&a,&b); x=(a-1)/m; y=(a-1)%m+1; x1=(b-1)/m; y1=(b-1)%m+1; x2=(n-1)/m; y2=(n-1)%m+1; if(x==x1) printf("1"); else { if(b==n) { if(y==1) printf("1"); else printf("2"); return 0; } if(y==1) { if(b==n) { printf("1"); return 0; } if(y1==m) printf("1"); else printf("2"); return 0; } if(y1==m) { printf("2"); return 0; } if(y==y1+1) { printf("2"); } else { if(x==x1-1) printf("2"); else { if(b==n) { if(y>y1) printf("3"); else printf("2"); } else printf("3"); } } } return 0; }
b. 一开始就被坑了, 以为是用网络流做的题(用网络比较难做),后面发现基本的贪心就可以解决, 从第一瓶开始倒,每次都尽量倒完,如果有一瓶需要倒到3或3个以上的杯子,则说明无解...
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; struct node { int id; double w; }; node g[55][55]; double h[55]; int main() { double n,w; int m; scanf("%lf%lf%d",&n,&w,&m); for(int i=1;i<=n;i++) h[i]=w; memset(g,0,sizeof(g)); double tmp; tmp=(n*w)/(double)m; int cnt=1; int flag=0; for(int i=1;i<=m;i++) { if(flag>=2) { printf("NO"); return 0; } double sum=0; int tcnt=0; while( h[cnt]+sum < tmp-0.000001) { sum += h[cnt]; g[i][tcnt].id=cnt; g[i][tcnt].w=h[cnt]; cnt++; flag=0; tcnt++; } if( h[cnt]+sum >= tmp -0.0000001&&h[cnt]+sum<=tmp+0.0000001) { g[i][tcnt].id=cnt; g[i][tcnt].w=h[cnt]; flag=0; cnt++; } else { g[i][tcnt].id = cnt; g[i][tcnt].w = tmp-sum; h[cnt] -= tmp-sum; flag++; } } printf("YES\n"); for(int i=1;i<=m;i++) { int j=0; while(g[i][j].id!=0) { printf("%d %.6lf ",g[i][j].id,g[i][j].w); j++; } printf("\n"); } return 0; }