1001 Drink:$\max\left\{\left\lceil\frac{m}{x}\right\rceil\cdot y\right\}$
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i, l, r) for (int i = (l); i <= (r); i++) 4 using namespace std; 5 6 int T, n, m, x, y; 7 8 int main(){ 9 freopen("drink.in", "r", stdin); 10 freopen("drink.out", "w", stdout); 11 for (scanf("%d", &T); T--; ) { 12 scanf("%d%d", &n, &m); int ans = 1e8; 13 rep(i, 1, n) scanf("%d%d", &x, &y), ans = min(ans, ((m - 1) / x + 1) * y); 14 printf("%d\n", ans); 15 } 16 return 0; 17 }
1002 GPA:模拟DP。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i, l, r) for (int i = (l); i <= (r); i++) 4 using namespace std; 5 6 int T, n; 7 double f[500]; 8 9 double G(int x) { 10 if (x >= 95) return 4.3; 11 if (x >= 90) return 4.0; 12 if (x >= 85) return 3.7; 13 if (x >= 80) return 3.3; 14 if (x >= 75) return 3.0; 15 if (x >= 70) return 2.7; 16 if (x >= 67) return 2.3; 17 if (x >= 65) return 2.0; 18 if (x >= 62) return 1.7; 19 if (x >= 60) return 1.0; 20 return 0; 21 } 22 23 int main(){ 24 freopen("GPA.in", "r", stdin); 25 freopen("GPA.out", "w", stdout); 26 f[0]=0; 27 rep(i, 1, 400) rep(j, 1, min(i, 100)) 28 f[i] = max(f[i], f[i - j] + G(j)); 29 for (scanf("%d", &T); T--; ) 30 scanf("%d", &n),printf("%.1lf\n", f[n]); 31 return 0; 32 }
1003 Dec:先打表。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 using namespace std; 5 6 const int N=1050; 7 int T,x,y,mp[N][N]; 8 9 int main(){ 10 freopen("dec.in","r",stdin); 11 freopen("dec.out","w",stdout); 12 mp[1][1]=1; 13 rep(i,2,1000) rep(j,1,i) 14 mp[i][j]=(__gcd(i,j)==1)+max(mp[i-1][j],mp[i][j-1]); 15 for (scanf("%d",&T); T--; ) 16 scanf("%d%d",&x,&y),printf("%d\n",mp[max(x,y)][min(x,y)]); 17 return 0; 18 }
1004 Civilization:枚举建立城市的位置,统计附近(曼哈顿距离3以内)各a值的点各有多少个,按a从高到低一次放居民,模拟即可。
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 using namespace std; 5 6 const int N=510; 7 int T,n,x0,y0,ans,f[4],a[N][N]; 8 9 int main(){ 10 freopen("1004.in","r",stdin); 11 freopen("1004.out","w",stdout); 12 for (scanf("%d",&T); T--; ){ 13 scanf("%d%d%d",&n,&x0,&y0); ans=1e8; 14 rep(i,1,n) rep(j,1,n) scanf("%d",&a[i][j]); 15 rep(x,1,n) rep(y,1,n){ 16 int sm=(abs(x-x0)+abs(y-y0)+1)/2,tot=0; 17 rep(i,x-3,x+3) rep(j,y-3,y+3) 18 if (i>=1 && i<=n && j>=1 && j<=n && abs(i-x)+abs(j-y)<=3) f[a[i][j]]++; 19 int s=a[x][y]; f[s]--; 20 rep(k,1,8){ 21 int t=(8*k*k-tot-1)/s+1; sm+=t; tot+=t*s; 22 if (f[3]) s+=3,f[3]--; 23 else if (f[2]) s+=2,f[2]--; 24 else if (f[1]) s+=1,f[1]--; 25 } 26 ans=min(ans,sm); 27 } 28 printf("%d\n",ans); 29 } 30 return 0; 31 }
1005 内层块长必定比外层短,故内层的一块至多与外层的一块相连,而外层则不一定,故若将每个黑块看成一个点,相邻两层的相连黑块之间连边,则构成一个森林。森林的连通块数=点数-边数。点数显然,考虑边数期望。
考虑外层的一个黑块,与内层某黑块相连的概率为$\frac{\frac{2\pi}{a_{i-1}}+\frac{2\pi}{a_{i}}}{2\pi}=\frac{1}{a_{i-1}}+\frac{1}{a_{i}}$,故相邻两层边数期望为$(\frac{1}{a_{i-1}}+\frac{1}{a_{i}})\cdot\frac{a_i}{2}\cdot\frac{a_{i-1}}{2}=\frac{a_i+a_{i-1}}{4}$。
最后答案化简为$\frac{a_1+a_n}{4}$
1 #include<cstdio> 2 #include<algorithm> 3 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 4 typedef long long ll; 5 using namespace std; 6 7 const int N=1010,mod=1e9+7; 8 int T,n,a[N]; 9 10 int ksm(int a,int b){ 11 int res=1; 12 for (; b; a=1ll*a*a%mod,b>>=1) 13 if (b & 1) res=1ll*res*a%mod; 14 return res; 15 } 16 17 int main(){ 18 freopen("rotate.in","r",stdin); 19 freopen("rotate.out","w",stdout); 20 for (scanf("%d",&T); T--; ){ 21 scanf("%d",&n); 22 rep(i,1,n) scanf("%d",&a[i]); 23 printf("%lld\n",1ll*(a[1]+a[n])*ksm(4,mod-2)%mod); 24 } 25 return 0; 26 }