您的位置:首页 > 其它

ZSC新生赛解题报告

2013-12-27 06:54 274 查看
PROBLEM A-So Easy-1284

题意:

求某年某月共有几天。

解题思路:

只需要判断大小月和是否为闰年二月。

判断闰年:年份(能被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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  解题报告