ACM-ICPC 2017 Asia Urumqi(第八场)
Posted shinianhuanniyijuhaojiubujian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM-ICPC 2017 Asia Urumqi(第八场)相关的知识,希望对你有一定的参考价值。
A. Coins
Alice and Bob are playing a simple game. They line up a row of nnn identical coins, all with the heads facing down onto the table and the tails upward.
For exactly mmm times they select any kkk of the coins and toss them into the air, replacing each of them either heads-up or heads-down with the same possibility. Their purpose is to gain as many coins heads-up as they can.
Input
The input has several test cases and the first line contains the integer t(1≤t≤1000) which is the total number of cases.
For each case, a line contains three space-separated integers n, m(1≤n,m≤100) and k(1≤k≤n.
Output
For each test case, output the expected number of coins heads-up which you could have at the end under the optimal strategy, as a real number with the precision of 3 digits.
样例输入
6 2 1 1 2 3 1 5 4 3 6 2 3 6 100 1 6 100 2
样例输出
0.500 1.250 3.479 3.000 5.500 5.000
题目来源
概率DP.
设dp[i][j]是第i次操作后正面朝上的概率,则反面朝上还有n-j枚,若n-j大于k,则k中任取
若n-j小于k,则必须从已经正面朝上的硬币中取j-(k-(n-j))枚
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #pragma GCC diagnostic error "-std=c++11" #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define esp 1e-9 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) int dcmp(double x){return fabs(x)<esp?0:x<0?-1:1;} typedef long long ll; int n,m,k,T; double dp[106][106]; double p[106],c[106][106]; void solve() { c[0][0]=1; for(int i=1;i<=100;i++) { c[i][0]=1; for(int j=1;j<=100;j++) c[i][j]=c[i-1][j-1]+c[i-1][j]; } p[0]=1; for(int i=1;i<=100;i++) p[i]=p[i-1]/2.0; } int main() { solve(); scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=0;i<m;i++) { for(int j=0;j<=n;j++) { for(int t=0;t<=k;t++) { if(n-j>=k) dp[i+1][j+t]+=dp[i][j]*c[k][t]*p[k]; else dp[i+1][n-k+t]+=dp[i][j]*c[k][t]*p[k]; } } } double ans=0.0; for(int i=1;i<=n;i++) ans+=i*dp[m][i]; printf("%.3lf ",ans); } return 0; }
B. The Difference
Alice was always good at math. Her only weak points were multiplication and subtraction. To help her with that, Bob presented her with the following problem.
He gave her four positive integers. Alice can change their order optionally. Her task is to find an order, denoted by A1,A2,A and A4?, with the maximum value of A1×A2?A3×A4?.
Input
The input contains several test cases and the first line provides an integer t(1≤t≤100) indicating the number of cases.
Each of the following t lines contains four space-separated integers.
All integers are positive and not greater than 100.
Output
For each test case, output a line with a single integer, the maximum value of A1×A2?A3×A4?.
样例输入
5 1 2 3 4 2 2 2 2 7 4 3 8 100 99 98 97 100 100 1 2
样例输出
10 0 44 394 9998
签到题
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #pragma GCC diagnostic error "-std=c++11" #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define esp 1e-9 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) int dcmp(double x){return fabs(x)<esp?0:x<0?-1:1;} typedef long long ll; int main() { int n,a[4]; scanf("%d",&n); while(n--){ for(int i=0;i<4;i++) scanf("%d",&a[i]); int ans=a[0]*a[1]-a[2]*a[3]; for(int i=0;i<4;i++) for(int j=0;j<4;j++) for(int k=0;k<3;k++) if(!(i==j || j==k || i==k)) ans=max(ans,a[i]*a[j]-a[k]*a[6-i-j-k]); printf("%d ",ans); } return 0; }
D. Fence Building
Farmer John owns a farm. He first builds a circle fence. Then, he will choose n points and build some straight fences connecting them. Next, he will feed a cow in each region so that cows cannot play with each other without breaking the fences. In order to feed more cows, he also wants to have as many regions as possible. However, he is busy building fences now, so he needs your help to determine what is the maximum number of cows he can feed if he chooses these n points properly.
Input
The first line contains an integer 1≤T≤100000, the number of test cases. For each test case, there is one line that contains an integer n. It is guaranteed that 1≤T≤105 and 1≤n≤1018.
Output
For each test case, you should output a line ”Case #i: ans” where i is the test caseS number, starting from 1 and ans is the remainder of the maximum number of cows farmer John can feed when divided by 109+7.
样例输入
3 1 3 5
样例输出
Case #1: 1 Case #2: 4 Case #3: 16
结论题
w=C(n,2)+C(n,4)+1;
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #pragma GCC diagnostic error "-std=c++11" #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define esp 1e-9 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) int dcmp(double x){return fabs(x)<esp?0:x<0?-1:1;} typedef long long ll; ll n,t; void exgcd(ll a,ll b,ll &x,ll &y) { ll t; if(!b){x=1;y=0;return ;} exgcd(b,a%b,x,y); t=x;x=y; y=t-a/b*x; } ll inv(ll n) { ll x,y; exgcd(n,MOD,x,y); return (x+MOD)%MOD; } ll C(ll n,ll m) { if(m>n) return 0; ll ans=1; for(ll i=1;i<=m;i++) { ans=(ans*(n-i+1)%MOD*inv(i)%MOD)%MOD; } return ans; } ll solve(ll n,ll m) { if(m==0) return 1; return C(n%MOD,m%MOD)*solve(n/MOD,m/MOD)%MOD; } int main() { scanf("%lld",&t); ll o=t; while(t--) { scanf("%lld",&n); printf("Case #%lld: %lld ",o-t,(solve(n,2)+solve(n,4)+1)%MOD); } return 0; }
G. The Mountain
All as we know, a mountain is a large landform that stretches above the surrounding land in a limited area. If we as the tourists take a picture of a distant mountain and print it out, the image on the surface of paper will be in the shape of a particular polygon.
From mathematics angle we can describe the range of the mountain in the picture as a list of distinct points, denoted by (x1,y1) to (xn,yn). The first point is at the original point of the coordinate system and the last point is lying on the x-axis. All points else have positive y coordinates and incremental xxx coordinates. Specifically, all x coordinates satisfy 0=x1<x2<x3<...<xn. All y coordinates are positive except the first and the last points whose yyy coordinates are zeroes.
The range of the mountain is the polygon whose boundary passes through points (x1,y1) to (xn,yn) in turn and goes back to the first point. In this problem, your task is to calculate the area of the range of a mountain in the picture.
Input
The input has several test cases and the first line describes an integer t(1≤t≤20) which is the total number of cases.
In each case, the first line provides the integer n(1≤n≤100) which is the number of points used to describe the range of a mountain. Following n lines describe all points and the iii-th line contains two integers xix_ixi? and yi(0≤xi,yi≤1000) indicating the coordinate of the i-th point.
Output
For each test case, output the area in a line with the precision of 666 digits.
样例输入
3 3 0 0 1 1 2 0 4 0 0 5 10 10 15 15 0 5 0 0 3 7 7 2 9 10 13 0
样例输出
1.000000 125.000000 60.500000
计算不规则多边形面积,因为x有序,y>0所以切成梯形来计算
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #pragma GCC diagnostic error "-std=c++11" #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define esp 1e-9 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) (memset(a,0,sizeof(a))) int dcmp(double x){return fabs(x)<esp?0:x<0?-1:1;} typedef long long ll; struct Point{ double x,y; }e[106]; int n,t; int main() { scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++) scanf("%lf%lf",&e[i].x,&e[i].y); double ans=0.0; for(int i=1;i<n;i++) ans+=(e[i].y+e[i-1].y)*(e[i].x-e[i-1].x); printf("%.6lf ",ans/2); } return 0; }
以上是关于ACM-ICPC 2017 Asia Urumqi(第八场)的主要内容,如果未能解决你的问题,请参考以下文章
ACM-ICPC 2017 Asia Urumqi G. The Mountain
ACM-ICPC 2017 Asia Urumqi:A. Coins(DP) 组合数学
ACM-ICPC 2017 Asia Urumqi A. Coins期望dp
ACM-ICPC 2017 Asia Urumqi:A. Coins(DP)