Codeforces Beta Round #4 (Div. 2 Only) 【完整题解】
KIDx 的解题报告http://codeforces.com/contest/4
以下省略头文件
A题
非一般的水
int main(){int x;while (~scanf ("%d", &x)){if ((x & 1) || x == 2)puts ("NO");else puts ("YES");}return 0;}
B题
题意:输入n和sum,再输入n个闭区间,每个区间找一个数,使得这些数的和等于sum,能找出输出"YES"并输出这些数【多种答案只要输出其中一种】,否则输出"NO"
简单构造一下解即可
int main(){int n, sum, i, a, b, x, y;while (~scanf ("%d%d", &n, &sum)){x = y = 0;memset (a, 0, sizeof(a));for (i = 0; i < n; i++){scanf ("%d%d", a+i, b+i);x += a, y += b;//x为最小和,y为最大和,可能形成的和为}for (i = n - 2; i >= 0; i--)a += a;//a = (a + a + … + a)if (sum >= x && sum <= y){puts ("YES");for (i = 0; i < n; i++){if (i > 0)printf (" ");int tp = min (b, sum-a);sum -= tp;printf ("%d", tp);}printf ("\n");}else puts ("NO");}return 0;}
C题
题意:输入一个用户名进行注册,如果该用户名之前木有被注册过,输出"OK",如果注册过在后面加个编号i,i从1开始,还存在,那么i++,直到可以注册为止,输出这个可以注册的用户名
注意一下这组数据:
http://dl.iteye.com/upload/attachment/584276/4e87954f-e1a9-3b50-96f1-209f1b2a7b8d.jpg
用map暴力搞搞即可
map<string, int> m;char ch, s;//必须开够哦int main(){int n, k, i, j, tp;while (~scanf ("%d", &n)){m.clear();while (n--){scanf ("%s", s);if (m == 0)puts ("OK");else{tp = m++;//tp获取s之前出现的次数,然后出现次数+1k = 0;while (tp){ch = tp % 10 + '0';tp /= 10;}ch = 0;//tp转为字符串加到s的后面j = strlen (s);for (i = k - 1; i >= 0; i--)s = ch;s = 0;printf ("%s\n", s);}m++;//s的出现次数+1}}return 0;}
D题
题意:输入n【信封个数】,w,h【卡片宽高】
是否存在x个信封组成的一叠信封使得x最大【这叠信封要严格有序,而且最小的信封必须要装得下卡片】
若存在,输出x以及这些信封【有序:从小到大】
若不存在,输出0,占一行
单调最长递增/减子序列模型,典型的dp水题
struct Dp{int v;int next;//记录路径}dp;struct envelope{int w, h, i;}e;bool cmp (envelope a, envelope b){if (a.w == b.w)return a.h > b.h;return a.w > b.w;}int main(){int n, w, h, i, j, maxs, v, num;while (~scanf ("%d%d%d", &n, &w, &h)){num = 1;for (i = 0; i < n; i++){scanf ("%d%d", &e.w, &e.h);e.i = num++;//编号num独立,不受下面的if影响if (e.w <= w || e.h <= h)i--, n--;}if (n <= 0)//没有信件可以装下卡片{puts ("0");continue;}for (i = 0; i < n; i++) //初始化dp.v = 1, dp.next = -1;maxs = 1;sort (e, e+n, cmp);v = 0;for (i = 0; i < n; i++)//单调最长递减子序列模型,逆向方便记录路径{for (j = i + 1; j < n; j++){if (e.h > e.h && e.w > e.w && dp.v < dp.v + 1){dp.v = dp.v + 1;dp.next = i;if (maxs < dp.v)maxs = dp.v, v = j;}}}printf ("%d\n", maxs);printf ("%d", e.i);for (i = dp.next; i != -1; i = dp.next)printf (" %d", e.i);printf ("\n");}return 0;}
页:
[1]