#164 (Div. 2)
A. Games
题意:有n个球队,两个之间会有比赛,每个球队有主场和客场的衣服并且颜色不同,当在自己主场比赛时,如果对方衣服和主场衣服颜色一样,就要穿客场衣服,问最多有多少场这样的情况。
分析:直接暴力。
#include <stdio.h> #include <string.h> int h[33], a[33]; int main() { int n,i, j; while (scanf("%d",&n)!=EOF) { for (i=0; i<n; i++) scanf("%d %d",&h[i],&a[i]); int res = 0; for (i=0; i<n; i++) for (j=0; j<n; j++) if (h[i] == a[j]) res++; printf("%d\n",res); } return 0; }
B. Buttons
题意:有n个按钮,一个密码的破译要求每个按钮按一次,如果按对了那个按钮就陷下去,否则所有按钮还原,问最多按多少次按钮可以破译密码。
分析:简单数学题。
#include <stdio.h> int main() { int tot; int n; int i; while (scanf("%d",&n)!=EOF) { tot = 0; for (i=1; i<n; i++) tot += i*(n-i); printf("%d\n",tot+n); } return 0; }
题意:给出一个n,m,找出一个点的集合(x,y)满足0<=x<=n且0<=y<=m且几何内任意两点的距离不是整数。’
分析:每个点都要占据一行和一列,这样下来最多能放Min(n,m)+1个点,而这些点只要在对角线上就能满足。
#include <cstdio> int main() { int n, m; int i; while (scanf("%d %d",&n,&m)!=EOF) { if (n>m) n = m; printf("%d\n",n+1); for (i=0; i<=n; i++) printf("%d %d\n",i,n-i); } return 0; }
E.Playlist
题意:有n首歌曲,知道了每首歌曲的播放时间和喜欢的概率,如果听到歌是喜欢的就会记录下来然后接着往下听,如果是不喜欢的就把之前喜欢的歌全部听一遍,歌曲的顺序可以 任意调整,问最长的收听时间的期望是多少。
分析:贪心+排序+概率
假设有两首歌,第一首歌时间为a,喜欢概率为x,第二首歌时间为b,喜欢概率为y
若收听顺序为ab,那么这两首歌收听总时间为a+b+a*x*(1-y)
若收听顺序为ba,那么这两首歌收听总时间为a+b+b*y*(1-x)
所以可以先按照a*x*(1-y)从小到大排序
求概率的时候设两个数组,
p[i] 表示前 i 首歌收听时间的期望值 ,则有 p[i] = v[i].pr * (p[i-1]+v[i].ti) + (1-v[i].pr) * (p[i-1]+v[i].ti+l[i-1])
l[i] 表示前 i 首歌中喜欢的歌的时间总长度的期望值,则有 l[i] = v[i].pr * (l[i-1]+v[i].ti) + (1-v[i].pr) * l[i-1]
#include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; struct pla { double ti, pr; bool operator <(const pla& x) const{ return ti*pr*(1.0-x.pr) > x.ti*x.pr*(1.0-pr); } }; double p[50005]; double l[50005]; int main() { //freopen("data.in","r",stdin); double ti,pr; int i, j; int n; while (scanf("%d",&n)!=EOF) { vector<pla>v; for (i=0; i<n; i++) { scanf("%lf %lf",&ti,&pr); pr /= 100.0; v.push_back((pla){ti,pr}); } sort(v.begin(),v.end()); p[0] = l[0] = 0; for (i=1; i<=n; i++) { p[i] = v[i-1].pr*(p[i-1]+v[i-1].ti)+(1.0-v[i-1].pr)*(p[i-1]+v[i-1].ti+l[i-1]); l[i] = v[i-1].pr*(l[i-1]+v[i-1].ti)+(1.0-v[i-1].pr)*l[i-1]; } printf("%.9lf\n",p[n]); } return 0; }