第一次双周赛-创新互联
Lily
题目成都创新互联-专业网站定制、快速模板网站建设、高性价比龙岩网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式龙岩网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖龙岩地区。费用合理售后完善,10多年实体公司更值得信赖。实现
代码块
新闻名称:第一次双周赛-创新互联
文章网址:http://scyanting.com/article/coicoo.html
QAQ,就是用if else if else翻译一下题目条件QAQ没有别的难度!!
代码块#includeusing namespace std;
const int maxn = 1000;
char str[maxn];
int main()
{
int n; cin >>n;
for (int i = 0; i< n; i++)cin >>str[i];
for (int i = 0; i< n; i++)
{
if (i == 0)
{
if (str[i] == '.' && str[i + 1] != 'L')
str[i] = 'C';
}
else if (i == n - 1)
{
if (str[i] == '.' && str[i - 1] != 'L')str[i] = 'C';
}
else
{
if (str[i] == '.' && str[i - 1] != 'L' && str[i + 1] != 'L')str[i] = 'C';
}
}
for (int i = 0; i< n; i++)cout<< str[i];
return 0;
}
a*b
题目实现QAQ,在写高精度乘法的时候很认真在写了,所以周赛时大概没在高精度乘法上出问题(自己记忆了自己的模板),不过在进制转化过程可能多考虑了几步,但是无论如何提交都是段错误,我并不理解!!甚至在考试下修改的时候也依然是错误的,emm,后来在DDL查看了一下其他人的题解后发现主体计算部分并没有什么区别,大同小异,最后被逼无奈,把char[]转为string 结果段错误消失了, 我不是很理解QAQ
代码实现#include#includeusing namespace std;
const int maxn = 2005;
int a[maxn], b[maxn];
int pro[maxn];
int main()
{
string A, B;
cin >>A >>B;
//倒置并完成数组的类型转换
int alen = A.size();
for (int i = 0; i< A.size(); i++)
{
if (A[alen - 1 - i] >= '0' && A[alen - 1 - i]<= '9')
a[i] = A[alen - 1 - i] - 48;
else
{
if (A[alen - 1 - i] >= 'A' && A[alen - 1 - i]<= 'Z')
a[i] = A[alen - 1 - i] - 55;
}
}
int blen = B.size();
for (int i = 0; i< blen; i++)
{
if (B[blen - 1 - i] >= '0' && B[blen - 1 - i]<= '9')
b[i] = B[blen - 1 - i] - 48;
else
{
if (B[blen - 1 - i] >= 'A' && B[blen - 1 - i]<= 'Z')
b[i] = B[blen - 1 - i] - 55;
}
}
//完成乘积的运算
for (int i = 0; i< alen; i++)
for (int j = 0; j< blen; j++)
pro[i + j] += a[i] * b[j];
//由于乘完以后我们不知道pro有多长 所以从最后一个pro检索,记录pro的长度
int len = alen + blen;
//记录pro的长度后开始逐个逐个判断是否有进位
for (int i = 0; i< len; i++)
{
pro[i + 1] += pro[i] / 16;
pro[i] %= 16;
}
//重新计算len
len = alen + blen;
for (; !pro[len];) len--;
for (int i = len; i >= 0; i--)
{
if (pro[i] >= 0 && pro[i]<= 9) cout<< pro[i];
else cout<< char(pro[i] + 55);
}
return 0;
}
山头狙击战
题目实现周赛过程中发现突破不了随时间递增距离递减的模拟,后放弃了这道题,在阅读了一些题解以后,发现并不需要对全部敌人统一向前,具体的实现办法放在代码块里写一下思路awa
代码块#include#include
using namespace std;
const int maxn = 1e5 + 5;
int army[maxn];
long long n, m;
bool check(int time)
{
long long timesum = 0;
//如果敌人的距离比射程远(注意是第一个敌人,其他敌人要换弹)
if (army[1] >m)
{
//那么射杀时间就是敌人的距离减去射程(而且一定是要射杀这个敌人)
//因为排过序啦 按顺序出现的敌人就是最近的敌人啦
timesum += army[1] - m;
}
//面对其他敌人的时候
for (int i = 2; i<= n; i++)
{
//神枪手换弹!
timesum += time;
if (army[i]< timesum)return false;
else
{
//记录下一个敌人的距离是army[i]-timesum
if (army[i]- timesum >m)
{
timesum = army[i] - m;
}
}
}
return true;
}
int main()
{
cin >>n >>m;
for (int i = 1; i<= n; i++)
cin >>army[i];
sort(army + 1, army + n + 1);
int l = 0, r = 1e7;
//简单的二分啦
while (l<= r)
{
int mid = (l + r) / 2;
if (check(mid))
{
l = mid + 1;
}
else
{
r = mid - 1;
}
}
printf("%d", l - 1);
return 0;
}
Reversing linked list反转链表
题目实现(题目是读了翻译看了题解)
使用数组去模拟,同时通过本节点的地址沟通了本节点的key值和下一个节点
代码块
#includeusing namespace std;
const int maxn = 1e5 + 5;
int key[maxn], nxt[maxn];
int ans[maxn];
int first, n, k;
int main()
{
cin >>first >>n >>k;
for (int i = 0; i< n; i++)
{
int add, keynum, nextp;
cin >>add >>keynum >>nextp;
key[add] = keynum;
nxt[add] = nextp;
}
//利用这种数组存地址的方式,以这种方式递推直到找到终点地址-1
//全部压入一个ans数组中,为使用reserve()埋伏笔
int index = 0;
for (int i = first; i != -1; i = nxt[i])
{
ans[index++] = i;
}
//保证在k段倒置,在超出k的段不改变
for (int i = 0; i + k<= index; i+=k)
{
reverse(ans + i, ans + i + k);
}
for (int i = 0; i< index; i++)
{
if (i >= index - 1)printf("%05d %d -1\n", ans[i], key[ans[i]]);
else printf("%05d %d %05d\n", ans[i], key[ans[i]], ans[i + 1]);
}
return 0;
}
一元三次方程
题目由于做过单峰函数的零点求解,所以只要设置一个合适的eps~用提示里的求根公式算出x1,x2,从p-x1,x1-x2,x2-q三段区间中各自有一个零点,然后利用零点存在定理巴拉巴拉巴拉巴拉,OK!到此全部思路完全通透!题目!AC!—然并卵,题目不通过,在赛后修改时,得知第二个测试点不过,阅读他人代码后
OK!!焯,原来x1和x2的大小并不是能由加减德尔塔决定的吗!
代码块#include#includeusing namespace std;
double a, b, c, d, p, q;
int t; double ans;
double fx(double x)
{
return a * x * x * x + b * x * x + c * x + d;
}
void print(double l, double r)
{
int flag = 1;
while (fabs(l - r) >= 1e-6)
{
double mid = (l + r) / 2;
double fx1 = fx(l);
double fx2 = fx(mid);
if (fx1 * fx2< 0)
{
r = mid;
ans = r;
}
else if (fx1 * fx2 >0)
{
l = mid;
ans = l;
}
else if (fx1 == 0)
{
printf("%lf ", l);
flag = 0;
break;
}
else if (fx2 == 0)
{
printf("%lf ", l);
flag = 0;
break;
}
}
if (flag)printf("%lf ", ans);
}
int main()
{
cin >>t;
while (t--)
{
cin >>a >>b >>c >>d >>p >>q;
double x2 = (sqrt(4 * b * b - 12 * a * c) - 2 * b) / (6 * a);
double x1 = -(sqrt(4 * b * b - 12 * a * c) + 2 * b) / (6 * a);
if (x1 >x2)swap(x1, x2);
print(p,x1);
print(x1,x2 );
print(x2,q);
}
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
新闻名称:第一次双周赛-创新互联
文章网址:http://scyanting.com/article/coicoo.html