ZSC新生赛解题报告
2013-12-27 06:54
274 查看
PROBLEM A-So Easy-1284
题意:
求某年某月共有几天。
解题思路:
只需要判断大小月和是否为闰年二月。
判断闰年:年份(能被4整除 且 不能被100整除) 或 能被400整除
PROBLEM B-小彬买水果-1285
题意:
求前数为后数的多少倍,非整倍用分数表示。
解题思路:
求出两者的最大公约数,判断是否整除关系再分别处理后输出。
PROBLEM C-挑选志愿者-1286
题意:
数学题,求组合。
解题思路:
公式:C(n,k)=n! / (k! * (n-k)!).
PROBLEM D-购物-1287
题意:
求购物步行往返的最短路程。
解题思路:
这题题意有点坑爹,看了一会儿才懂,将车停在离出口最近或最远的店铺对面,最近到最远的店铺之间的距离乘以2就是购物步行往返的最短路程。
PROBLEM E-迟到的蛋蛋-1288
题意:
求出新元素插入序列后是第几位。
解题思路:
先对原序列进行排序,然后用新元素与之依次比较大小找到位置即可。
PROBLEM F-LOL-1289
题意:
检测忽视除字母外其他符号的情况下有无连着的“LOL”字符串。
解题思路:
先对输入进行处理,把字母统一为大写后依次存到另一个数组,再对这个数组进行检查有无连着的“LOL”字符串。
PROBLEM G-砍树-1290
题意:
根据所输入的斧头属性与树木半径求出最多可砍多少树。
解题思路:
分别用两个数组储存斧头与树木,对其进行排序后,以最优分配(由先到后)匹配斧头和树木。比赛时因为边界条件的判断错了两次,正确应是尝试完所有斧头,在此过程中,若无树木可砍应不再尝试斧头。
PROBLEM H-贪心的小彬-1291
题意:
求连续进入任意间房子,最多能得到的金币个数。
解题思路:
其实就是求最大连续子序列和,比赛时没做出来,当时想复杂了尝试用不熟悉的分治或动态规划结果超时,回来后发现其实用简单的贪心即可,连数组都不用。
题意:
求某年某月共有几天。
解题思路:
只需要判断大小月和是否为闰年二月。
判断闰年:年份(能被4整除 且 不能被100整除) 或 能被400整除
#include <iostream> using namespace std; int main() { int y, m, ans; while (cin>>y>>m) { if (m==1||m==3||m==5||m==7||m==8||m==10||m==12)//大月 ans = 31; else if (m==4||m==6||m==9||m==11)//小月 ans = 30; else if (m==2)//二月 ans = 28; if (y%4==0&&y%100!=0||y%400==0&&m==2)//若为闰年二月则加一天 ans += 1; cout << ans << endl; } return 0; }
PROBLEM B-小彬买水果-1285
题意:
求前数为后数的多少倍,非整倍用分数表示。
解题思路:
求出两者的最大公约数,判断是否整除关系再分别处理后输出。
#include <iostream> #include <cstdio> using namespace std; int gcd (int a, int b) { int t = b; while (t) { t = a % b; a = b; b = t; } return a; }//辗转相除法求最大公约数 int main() { int a = 0, b = 0; while (cin >> a >> b) { int c; if (a > b) c = gcd (a, b); else c = gcd (b, a); //c为a与b的最大公约数 if (c == b) printf ("%d\n", a/b); //若最大公约数为b,a为b的整数倍,输出a/b的值 else printf ("%d/%d\n", a/c, b/c); //a不是b的整数倍,输出化简后的分数形式 } return 0; }
PROBLEM C-挑选志愿者-1286
题意:
数学题,求组合。
解题思路:
公式:C(n,k)=n! / (k! * (n-k)!).
#include <iostream> using namespace std; int factorial (int n) { int sum = 1; for (int i = 1; i <= n; i++) sum *= i; return sum; }//求n的阶乘 int main() { int n = 0, k = 0; while (cin >> n >> k) { int temp = factorial (k) * factorial (n - k); //k! * (n-k)! int ans = factorial (n) / temp; //n! / (k! * (n-k)!) cout << ans << endl; } return 0; }
PROBLEM D-购物-1287
题意:
求购物步行往返的最短路程。
解题思路:
这题题意有点坑爹,看了一会儿才懂,将车停在离出口最近或最远的店铺对面,最近到最远的店铺之间的距离乘以2就是购物步行往返的最短路程。
#include <iostream> #include <algorithm> using namespace std; int main() { int n, shop[110]; cin >> n; for (int i = 0; i < n; i++) cin >> shop[i]; sort (shop, shop + n); //调用库函数按升序排序 cout << (shop[n - 1] - shop[0]) * 2 << endl; //(最大值-最小值)*2 return 0; }
PROBLEM E-迟到的蛋蛋-1288
题意:
求出新元素插入序列后是第几位。
解题思路:
先对原序列进行排序,然后用新元素与之依次比较大小找到位置即可。
#include <iostream> #include <algorithm> using namespace std; int main() { int n, m; while (cin >> n >> m) { int high[25]; for (int i = 0; i < n; i++) cin >> high[i]; sort (high, high + n); //调用库函数排序 int i = 0; while (high[i] < m) i++;//找位置 cout << i + 1 << endl; //输出是队列中第几个 } return 0; }
PROBLEM F-LOL-1289
题意:
检测忽视除字母外其他符号的情况下有无连着的“LOL”字符串。
解题思路:
先对输入进行处理,把字母统一为大写后依次存到另一个数组,再对这个数组进行检查有无连着的“LOL”字符串。
#include <iostream> #include <cstring> using namespace std; int main() { char lol[110], ans[110]; cin.getline (lol, 101); //读入字符串 int len = strlen (lol), j = 0;//len为所输入字符串实际长度 for (int i = 0; i < len; i++) { if (lol[i] <= 'Z' && lol[i] >= 'A') ans[j++] = lol[i];//若为大写字母则将其按出现顺序存到另一个字符数组 }//j为ans字符串的实际长度 ans[j]=0; int ok = 1;//初始状态为OK for (int i = 0; i <= j - 3; i++) if (ans[i] == 'L' && ans[i + 1] == 'O' && ans[i + 2] == 'L') ok = 0;//若发现连着的LOL则使OK等零 if (ok) cout << "OK" << endl;//若OK不为零,输出OK else cout << "OH" << endl; return 0; }
PROBLEM G-砍树-1290
题意:
根据所输入的斧头属性与树木半径求出最多可砍多少树。
解题思路:
分别用两个数组储存斧头与树木,对其进行排序后,以最优分配(由先到后)匹配斧头和树木。比赛时因为边界条件的判断错了两次,正确应是尝试完所有斧头,在此过程中,若无树木可砍应不再尝试斧头。
#include <iostream> #include <algorithm> using namespace std; int main() { //输入 int n, m; cin >> n >> m; int ax[10010], tree[10010]; for (int i = 0; i < n; i++) cin >> ax[i]; for (int i = 0; i < m; i++) cin >> tree[i]; //排序 sort (ax, ax + n); sort (tree, tree + m); //匹配 int sum = 0; //能砍的树木数 int tax = 0, ttree = 0; //标记未匹配的第一个 while (tax != n && ttree < m) //当斧头未尝试匹配完毕且树木未砍完 { if (ax[tax] >= tree[ttree]) //若该斧头能砍该木 { tax++; ttree++;//斧头与树木的标记均移向下一个 sum++;//数目加1 } else//该斧头不能砍该木 tax++;//标记移向下一把斧头 } cout << sum << endl; return 0; }
PROBLEM H-贪心的小彬-1291
题意:
求连续进入任意间房子,最多能得到的金币个数。
解题思路:
其实就是求最大连续子序列和,比赛时没做出来,当时想复杂了尝试用不熟悉的分治或动态规划结果超时,回来后发现其实用简单的贪心即可,连数组都不用。
#include <stdio.h> int main() { int n;//输入房屋个数 scanf ("%d", &n); int money = 0, tempsum = 0, sum = 0;//分别代表:一间房屋的金钱变化,已有值,最终答案 for (int i = 0; i < n; i++) //从第一间走到最后一间 { scanf ("%d", &money);//读取进房屋后的金钱变化 tempsum += money;//已有值加上金钱变化 if (tempsum > sum) sum = tempsum;//如果变化后的已有值比目前所求的答案大,则将其赋值给答案 if (tempsum < 0) tempsum = 0;//如果已有值为负,则代表之前所走过的房间亏了,舍弃它们,重置已有值为零 } printf ("%d\n", sum); return 0; }
相关文章推荐
- POJ 1979
- Roman numerals 解题报告
- Codeforces 193 Div 2
- hdu 1520-树形dp
- Codeforces Round #184 (Div. 2) D、E
- XOJ 1004.Sort Ver.2 From XMU
- fafu1224 - Ping
- poj 1014 解题报告
- 湖南工业大学个人选拔赛第二场 解题报告
- 百练2750:鸡兔同笼问题解题报告
- 百炼POJ 2808 校门外的树
- 百练POJ 2801: 填词
- POJ 1017 装箱问题 解题报告
- 百炼 poj 2807:两倍
- HDU1874 畅通工程续 解题报告--最短路dijkstra算法
- HDU2145 zz's Mysterious Present 解题报告 ——最短路dijkstra算法
- CF:Eugeny and Array
- cf:B-QR code
- cf:Whose sentence is it?
- CF:Ilya and Bank Account