第一次双周赛-创新互联

Lily 题目

在这里插入图片描述

成都创新互联-专业网站定制、快速模板网站建设、高性价比龙岩网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式龙岩网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖龙岩地区。费用合理售后完善,10多年实体公司更值得信赖。实现

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