题目链接网址:Contest Problem List (hdu.edu.cn)
1001 | 是一道图上操作问题,求概率,比赛时未读题,日后有时间再补题,图上操作代码水平下降极为厉害 |
1003 | 全场第四easy题目,读完题发现是DP题,果断放弃,DP一直处于弱项,需要不断加强训练学习 |
1004 | 签到题,推导一下后即为求一个数的除1以外的最小因子, 但是未考虑到给出a, b两个数字可能出现相同的情况,T掉1次,WA掉2次后才解决问题 |
1006 | 一道贪心的算法题,维护最左侧的第一个和第二个连续的最大值即可,比赛时使用优先队列的方法导致T, 补题时使用数组重新A掉 |
1008 | 相当于构建一个环形,判断环形是否会到达某一点, 1A |
在很久未做算法题后,参加一两次比赛检验一下退化的水平,长时间写python代码后导致写C++代码稍有不适。做题过程中, 代码能力下降厉害,思路也不如以往。其中1006一道较为擅长的贪心题最终却未能AC。每次遇到DP的题目均直接放弃,痛定思痛,决定彻底学习一下DP的算法。AC两道, 罚时3次。
1003
1004
签到题, 通过列数学等式可知:x * c + z = a, y * c + z = b, 该题即判断abs(a - b)之后因子的最大值和除一之外的最小值。将特殊情况,a = b 考虑清楚即可。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a, b, T;
scanf("%lld", &T);
while(T--)
{
scanf("%lld%lld", &a, &b);
ll max_, min_;
if(a > b)
{
max_ = a;
min_ = b;
}
else
{
max_ = b;
min_ = a;
}
ll c_max = -1, c_min = -1;
c_max = max_ - min_;
ll k = max_ - min_;
for(ll i=2; i<= ll(sqrt(k * 1.0)) + 1; i++)
{
if(k % i ==0)
{
c_min = i;
break;
}
}
if(k >= 2 && c_min == -1)
{
c_min = k;
}
if(max_ == min_ && max_ >= 2)
{
c_max = max_;
c_min = 2;
}
if(c_max != -1 && c_min != -1)
{
printf("%lld %lld\n", c_min, c_max);
}
else
printf("-1 -1\n");
}
return 0;
}
1006
1008
可以将图中的问题构建成一个矩阵的形式表示成一个环形,然后根据环形的起点,判断是否会最后击杀狼人。问题即可解决1A。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 55;
int T, n;
int val[maxn];
int die[maxn];
int vis[maxn][maxn];
int main()
{
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(die, 0, sizeof(die));
memset(val, 0, sizeof(val));
memset(vis, 0, sizeof(vis));
int k = 0;
bool win = false;
for(int i=1; i<=n; i++)
{
scanf("%d", &val[i]);
if(val[i] == 1)
{
k = i;
}
}/*
for(int i=1; i<=n; i++)
{
printf("%d ", val[i]);
}
printf("\n");*/
for(int i = 1; i<= n; i++)
{
for(int j = 1; j<= n; j++)
{
scanf("%d", &vis[i][j]);
}
}/*
for(int i=1; i<= n; i++)
{
for(int j=1; j<=n; j++)
{
printf("%d ", vis[i][j]);
}
printf("\n");
}*/
int count_ = 0;
for(int i=1; i<=n; i++)
{
int num = vis[k][i];
if(num != k && die[num] == 0)//狼人杀人
{
int out = num; //被杀猎人
die[num] = 1;
//cout << out << endl;
count_++;
int out_k;
while(out)
{
int con = 0;
for(int i=1; i<=n; i++)
{
out_k = vis[out][i];
if(out_k == k)//狼人被击杀
{
win = false;
con = 1;
break;
}
if(out_k != k && die[out_k] == 0)//猎人被击杀
{
die[out_k] = 1;
count_++;
out = out_k;
//cout << out << endl;
break;
}
}
//cout << " " << count_ << endl;
if(count_ >= n - 2)
{
win = true;
con = 1;
}
//cout << "con" << con << endl;
if(con == 1)
{
break;
}
}
}
break;
}
if(win == true)
{
printf("langren\n");
}
else
printf("lieren\n");
}
return 0;
}