2018年广东工业大学文远知行杯新生程序设计竞赛
感觉蛮丢人的其实,毕竟大二的学生去做新生赛的题目,然后还有这样那样的题目不会。
比赛的题面长是一个点,但是我觉得更多的是知识水平的方面。
各种捏他玩梗写作文,出题人也是蛮拼的,但是看完全部题目之后只会觉得四斋蒸鹅心(中国语)。
一共13题,做了8题。许多题目都有同学这样那样的帮助。
3、5、8、9、11没A。
看了一下自己的提交 2018-12-01 15:38:36 是最后一次,也就是说最后的一个半小时在挂机(偷懒)(这个人也真是= =|||没救)。
1003 名为青春的悖论β (可以用前缀和做,四重循环暴力也可)(需要再做再理解)
#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int maxn = 1005;
int main()
{
int n;
int sum[505] = {0};
while (cin >> n)
{
int ss = 0;
for (int i = 1; i <= n; i++)
{
int t;
scanf("%d", &t);
ss += t;
sum[i] = ss;
}
if (n < 4)
{
printf("0\n");
continue;
}
double s = ss/ 2.0;
int tt = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
if (sum[i] + s == sum[j])
{
tt++;
}
}
}
int ans = 0;
for (int i = 1; i < tt; i++)
{
ans += i;
}
cout << ans << endl;
}
system("pause");
return 0;
}
我一直写不出来,我认为的是有两种想法杂糅在了一起,然后交错下就理不清。
然后前缀和的话算是其中一种的进阶的写法(但是我还是没能完全理通)。
首先列出一些显而易见的结论,弦和弧的关系:如果弧和弧相等,那么这两条弧对应的边也相等。
那么如果我们有两条弧相等,然后剩下的两条弧也相等,而且相等的两条弧是在圆的两侧,那么这个矩形就成立。
然后,问题是怎么去判断两条弧相等?以上的代码是有参考学长的,利用前缀和。
先把圆分成两个半圆弧,然后我们不保存所有的圆弧,我们保存的是圆弧的和,即1是前1个的和,2是前2个弧的和。
这个时候我们确认弧A是否与弧A对面的弧——弧B相等的时候,只要加上他们的差,也就是半圆弧的长度就可以。
我想不通的地方在于最后的ans+=i,我的猜想是,如果弧A是第一条、第二条、第三条弧的和,那么累加后即为sum[3],如果这个sum[3]与对面的弧相等了,那么意味这sum[3]中还有弧可以和对面的弧相等。
还有一点我想不通的是,这种方法是不用确认另一对边的,却也不会重复计算。