六月九号补题日记:Codeforces Round 877 (Div. 2)

专注是不够的,很重要的一方面在于细节,关注细节:精细和专注才是成功的重点!!! 

A 题意:给你一堆数字,说这一堆数字是由最初的两个数字相减得到的,让你求出两个数字其中一个,特别标明,不需要你求另一个数字:

1.怎样做:这个题目自己没有思考出来,有一部分原因是没有读题读清楚,绝对值,所有的数字是由最初的两个数字相减的绝对值得到的,所以说如果出现了负数,那肯定是原来的数字当中一个

如果没有负数,全部都是正数,最大的肯定是刚开始的一个数字,应为最大的数字在进行相减的过程中不会变小

2为什么: 首先应该反应出来负数一定是原来的,这样我们就能想如果没有负数的情况,最大的数字是没有变化的,最大的值会一直不变

3下次如何想起来:这里可以积累一个基本活动经验,如果是绝对值相减,产生的新的数字,一定是小于最初的最大的数字的,不会大于它

4生活联系:

5博弈:最后三个样例,都是有一个负数的情况,但是只有一个是负数,如果都是负数,我们可能就知道答案了,这种情况是最不好想的,所以我们没有必要就是按照样例来,我们可以坚定心中的答案

看别人的代码,我们可以不用统计最大的值和最小的值,这里可以直接用一个sort

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		int n;cin>>n; int a[n];
		for(int i=0;i<n;i++) cin>>a[i];
		sort(a,a+n);
		if(a[0]>=0) cout<<a[n-1]<<endl;
		else cout<<a[0]<<endl;
	}
	return 0;
}

B:   题意:如何调整排列当中的数字的顺序,让排列的排列子序列最少

1怎么做:其实排列有非常严格的要求,破坏一个数字就不是排列了,所以这样来看题目条件没有那么多:这个题目的样例过于明显了 1 和 2 应该是位于最大值的两边

2为什么:1 2靠着肯定是会多一个的,如果用最大值把1和2分开,就会减少这个

3下次想起来:真希望遇见同类型的题目哈哈哈

4生活联系:这个想不起来啥联系如果有日后补充哈哈哈

这个题目的代码确实非常的漂亮,通过一个swap,的确把c x 定位成1 或者 2 比较靠前和比较靠后的位置

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
	ll n,a,c,d,x;
	cin>>n;
	while(cin>>n){
		//c 记录的是1在数组当中的位置
		//d 记录的是n在数组当中的位置
		//x 记录的是2在数组当中的位置
		
		for(int i=1;i<=n;i++){
			cin>>a;
			if(a==1)
				c=i;
			else 
				if(a==n)d=i;
				else if(a==2)x=i;
		}
		
		//x是1和2位置更加靠后的那个的位置
		//c是1和2位置更加考前的那个的位置
		if(c>x)swap(c,x);
		if(x>d &&c<d)cout<<"1 1\n";
		else if(c>d)cout<<d<<" "<<c<<endl;
		else if(x<d)cout<<x<<" "<<d<<endl;
	}
	return 0;
}

5博弈论:是的,这个和一些迷惑性的答案就不一样,这个样例解释太明显了,应该大胆想象出来

C:题意:上下左右相邻不可以是素数,这样应该怎么弄

1怎样做:怎样写代码:说做法之前,我们先来如何打出这样的代码

3行6列的数字排列:

 1   2  3 

  4  5   6

   7  8  9

10 11 12

13 14 15

16 17 18

如果说按照上述输出显然很简单,两个for循环,但是我现在不想这样输出了,我想先输出(从1开始)第三行,然后输出第一行,然后输出第五行,然后输出第二行,这样奇数偶数行间隔并且先输出奇数行然后输出偶数行,如何输出?

首先是分支结构:if-else-if

if(i % 2 == 0){
    
}
else{
    
}

所以说:i = 0 cout: 7 8 9

              i  = 1 cout:1 2 3

              i  = 2 cout:10 11 12

              i  = 3 cout:4  5  6

所以说:如果i = 1 或者i = 3 就是:

(i / 2)* m + j + 1

             如果i = 0 或者i = 3就是:

cout << (n / 2 + i / 2) * m + j + 1 

至于这里的道理,我也不知道为什么,但是我需要记住这个东西,他就是这样输出的

思路:具体怎么做的,思路是这样的:首先说到非素数,第一时间想到的就应该是1,最小的素数是2,所以如果我们直接按照原始的排列放数字,(就应该大胆尝试啊,如果以后没有好的办法就只能这样尝试,如果不尝试,不可能有办法做出来的 大胆尝试),这样就会发现横着相比之间相差1,横着满足要求了,但是竖着我们发现相差为m,如果说m是素数,那就不符和要求,但是素数的倍数一定是符合要求的,所以说如果我们隔着输出,就符合要求了,最少是二倍,所以我们就隔着输出,二倍的话就是先输出第三行,然后输出第一行,然后输出第四行,然后输出第二行,就是我们上述讲到的输出方式

你看,其实也不复杂,就在于大胆的尝试,思考,如果不尝试,根本不可能想出来,刚开始看到非素数,感觉好难啊,其实,一点都不复杂

2.0为什么:这里为什么上面已经说清楚了

3以后如何想起来:一个是非素数先从1开始,其次这样的隔着输出的方法下次就要想到

4和生活联系:感觉很经典的输出方式

5.和答案的联系:这个答案就没有其他的提示性,所以说样例用好了是关键,用不好是祸害

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codeforces1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值