总共六道题,质量挺好的,适合大一新手,第三题找规律把我坑了一下,4次提交....可怜的罚时啊.....
第一题:三角形的边
一道简单的排序题,将三个数排序,输出前两个和减去最大的.....主要的就是熟悉一下ACM的I/O环境。
普通方法不教了,教一个懒人方法,直接定义一个数组,sort一下,sort是再algorithm的函数。
#include
#include
using namespace std;
int a[3];
int main()
{
while (cin >> a[0] >> a[1] >> a[2])
{
if (a[0] == 0 && a[1] == 0 && a[2] == 0)
break;
sort(a, a + 3);
cout << a[0] + a[1] - a[2];
}
return 0;
}
第二题:字符串的反码
挺不错的字符串处理题.....先读入字符串,之后根据要求变换输出,注意一点,有可能存在!XX的情况,这样就要判断读入的字符串第一个是!第二是0;
代码:
#include
#include
#include
using namespace std;
char change(char x)
{
if (x >= 'A' && x <= 'Z')
return (char)('Z' - (x - 'A'));
else
if (x >= 'a' && x <= 'z')
return (char)('z' - (x - 'a'));
else
return x;
}
int main()
{
string str;
while (cin >> str)
{
if (str[0] == '!' && str[1] == 0)
break;
for (int i = 0; str[i]; ++i)
{
str[i] = change(str[i]);
}
cout << str << endl;
}
return 0;
}
第三题:Greedy niky
一道找规律的题,首先我们确定一点,就是四面体某个面压的土地是固定的,所以我们将土地分成四类,在图上给的16个三角形划分出来,不难发现编号%4余1的和1号一样,%4余3的和3号一样,之后我们不难发现,1,3一组,2,4一组,在每一行的交替出现的,131313或者24242....而行的关系是,每组出现两次,13组出现两行,之后24组出现两行.....之后按照这个规律把1000以内的土地所属的类分出来就行了。
#include
#include
#include
using namespace std;
int f[1010];
void init()
{
f[1] = 1, f[2] = 2, f[3] = 3, f[4] = 4, f[6] = 4;
for (int i = 1; i < 1005; ++i)
{
if (i % 4 == 1)
f[i] = 1;
if (i % 4 == 3)
f[i] = 3;
}
int type = 4;
int num = 1;
int t, flag = 0;
for (int i = 1; i <251;)
{
for (int j = 0; j < num; ++j)
{
f[i * 4] = type;
i++;
}
int x = i - 1;
if (type == 4)
t = num;
else
t = num + 1;
if (flag)
{
while (t--)
{
f[x * 4 + 2] = type;
x++;
}
}
else
flag = 1;
if (type == 2)
{
type = 4;
num++;
}
else
type = 2;
}
}
int main()
{
int n, m;
init();
while (scanf("%d%d", &n, &m) != EOF)
if (f[n] == f[m])
puts("yes");
else
puts("no");
return 0;
}
第四题:Pocket Money Plan
一道模拟题,按着它说的做,每做一次天数加1就行了。
代码:
#include
#include
#include
using namespace std;
int main()
{
int Case, m;
cin >> Case;
while (Case--)
{
int d = 0;
cin >> m;
while (m)
{
d++;
double tmp = m;
int c = m;
tmp /= 10;
c = c - ceil(tmp);
m = c;
}
cout << d << endl;
}
return 0;
}
第五题:供热管道优化
因为题目要求是一条垂直与x的轴的,所以y坐标明显废了,因为点到这个线肯定是垂直的,所以距离就是这个线的x坐标和那个点的x坐标之差了。将x坐标排序,去中间的,之后累加别的x到这个中位的距离就行了。
代码:
#include
#include
#include
using namespace std;
int fabs(int x)
{
if (x > 0)
return x;
else
return -x;
}
int main()
{
int x[1510], y[1510];
int n;
while (cin >> n && n)
{
for (int i = 0; i < n; ++i)
cin >> x[i] >> y[i];
sort(x, x + n);
int t, sum = 0;
t = x[(n + 1) / 2 - 1];
for (int i = 0; i < n; ++i)
sum += fabs(x[i] - t);
cout << sum << endl;
}
return 0;
}
第六题:Just the Facts
求解n的阶乘第一位不为0的数是几,a[i]数组记录是i这个数阶乘第一位不为0的是几....之后递推到1000就行了.....
如果i这个数不能被5整出,那么a[i] = (a[i - 1] * i) % 10;
如果i被5整出,就是 a[i] = b[(n - 1) % 4 + 1] * a[n] % 10;
代码:
#include
#include
using namespace std;
long long a[10010], b[5] = {0, 2, 4, 8, 6};
int main()
{
int n, m;
a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 6, a[4] = 4, a[5] = 2;
for (int i = 6; i < 10001; ++i)
{
m = i % 5;
n = i / 5;
if (m != 0)
a[i] = a[i - 1] * i % 10;
else
a[i] = b[(n - 1) % 4 + 1] * a[n] % 10;
}
while (scanf("%d", &n) != EOF)
printf("%5d -> %d\n", n, a[n]);
return 0;
}