202012-1

问题描述

  • 20201201.png

解决

这个题目过于简单,只有题目的描述方式会让人反应一会,简单来说就是获取每两项的乘积之和,判断和0的关系,最后输出对应的结果。直接上代码

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//  	216B | C++ | 正确 | 100 | 93ms | 2.898MB |

#include <iostream>
using namespace std;
int main()
{
int n = 0;
cin>>n;
int count = 0;
for(int i = 0;i < n;i++){
int a,b;
cin>>a>>b;
count+=a*b;
}
if(count<=0){
cout<<"0";
}
else{
cout<<count;
}
}

202012-2

问题描述

  • 20201202.png

解决

预设阈值,预测结果,和真实结果进行比较,根据最终预测准确率的高低选出最合适的阈值,理解起来比1更简单。

第一版解决

采用set来进行去重,采用两个数组来存储输入的数据,初始化后采用两重for循环来进行比较
###第一版代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//730B	C++	运行超时	70	运行超时	8.074MB
#include <iostream>
#include <set>
using namespace std;

int main(){
int num = 0;
cin>>num;
int pinggu[num];
int shiji[num];
int FaZhi = 0;
int ZhunQueLv = 0;
set<int> test;
set<int>::iterator iter;
for(int i = 0;i<num;i++){
cin>>pinggu[i]>>shiji[i];
test.insert(pinggu[i]);
}
FaZhi = pinggu[0];
//以上为初始化部分
for(iter = test.begin();iter!=test.end();iter++){
int kkk = *iter;
int zhunquelv = 0;
for(int i = 0;i<num;i++){
if((kkk<=pinggu[i]&&shiji[i]==1)||(kkk>pinggu[i]&&shiji[i]==0)){
zhunquelv++;
}
}
if(zhunquelv == ZhunQueLv){
if(kkk>FaZhi){
FaZhi = kkk;
}
}
if(zhunquelv > ZhunQueLv){
FaZhi = kkk;
ZhunQueLv = zhunquelv;
}
}
cout<<FaZhi;
return 0;
}

考虑到可能是双层循环的原因于是去查看了其他人的ac,发现只用单层循环就可以实现

第二版代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<iostream>
#include<algorithm>
using namespace std;

struct Stu{
int y;
int result;
};

bool cmp(Stu a,Stu b)
{
return a.y<b.y;
}
int main()
{
long long n;
cin>>n;
Stu s[n];

for(int i=0;i<n;i++)
{
cin>>s[i].y>>s[i].result;
}
sort(s,s+n,cmp);
int t=s[0].y;
int c=0;
for(int j=0;j<n;j++)
{
if(s[j].y<t && s[j].result==0 || s[j].y>=t && s[j].result==1)
{
c++;
}
}
int edi=s[0].y;
int ed=s[0].result;
int maxi=t;
int max=c;
int f=0,flag=0;
for(int i=1;i<n;i++)
{
int f1=0;
if(s[i].y==edi)
f1=1;
if(f1==1 || f==1)
{
flag==1;
f1=0;
f=0;
}
else
flag=0;
if(ed==0 && s[i].result==0 && !flag)
{
c++;
}
else if(ed==1 && s[i].result==0 && !flag)
{
c--;
}
else if(ed==0 && s[i].result==1 && !flag)
{
c++;
}
else if(ed==1 && s[i].result==1 && !flag)
{
c--;
}
if(max<=c)
{
max=c;
maxi=s[i].y;
}
edi=s[i].y;
ed=s[i].result;
f=f1;
}
cout<<maxi;
return 0;
}

收获

  • 用struct或者使用标准库中的pair类型

20200901 监测点查询

建立坐标结构体,描述坐标的特性,注意在交换swap方法中要传入引用而不是普通传入,否则无法完成调换,注意题目中关于变量距离相等时的条件描述。

主要逻辑思想如下:

  • 初始化,读入第一行数据
  • 初始化缓存区,对前三次输入进行处理,分出次序
  • 读入剩余部分,进行缓冲区排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <bits/stdc++.h>
using namespace std;

struct zuobiao{
int x;
int y;
int n;
};

int jisuan(zuobiao a, zuobiao b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}

bool bijiao(zuobiao a,zuobiao b,zuobiao c){
if(jisuan(a, b)<jisuan(a,c)){
return false;
}
else if(jisuan(a, b)==jisuan(a,c)){
if(b.n<c.n){
return false;
}
else
return true;
}
else return true;
}

void swap1(zuobiao &a, zuobiao &b){
int q,w,e;
q = a.x;
w = a.y;
e = a.n;
a.x = b.x;
a.y = b.y;
a.n = b.n;
b.x = q;
b.y = w;
b.n = e;
}

int main(){
zuobiao a;
int num;
cin>>num>>a.x>>a.y;
a.n = 0;
zuobiao q[3];
cin>>q[0].x>>q[0].y;
q[0].n = 1;
cin>>q[1].x>>q[1].y;
q[1].n = 2;
if(bijiao(a,q[0],q[1])){
swap1(q[0],q[1]);
}
cin>>q[2].x>>q[2].y;
q[2].n = 3;
if(bijiao(a,q[0],q[2])){
swap1(q[0],q[2]);
}
if(bijiao(a,q[1],q[2])){
swap1(q[1],q[2]);
}
for(int i = 3;i<num;i++){
zuobiao tmp;
cin>>tmp.x>>tmp.y;
tmp.n = i+1;
for(int k = 0;k<3;k++){
if(bijiao(a,q[k],tmp)){
swap1(tmp, q[k]);
}
}
}
for(int i = 0;i<3;i++){
cout<<q[i].n<<endl;
}
return 0;
}

20200902 风险人群筛查

主要逻辑思想如下:

  • 结构体
  • 判断是否在矩形区域内
  • 设计变量判断是否在矩形区域内停留超过阈值
  • 循环多次进行统计

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
using namespace std;

struct zuobiao{
int x;
int y;
};

bool panduan(int x, int y, int x1, int y1, int x2, int y2){
if(x>=x1&&x<=x2&&y>=y1&&y<=y2)
return true;
else
return false;
}

int main(){
int num,yuzhi,jilu,x1,y1,x2,y2;//输入的第一行
cin>>num>>yuzhi>>jilu>>x1>>y1>>x2>>y2;
int jingguo,jingbao;//输出的第一行和第二行
jingguo = 0;
jingbao = 0;
zuobiao tmp;
for(int i = 0;i<num;i++){
int cishu = 0;//判断经过危险区的次数
bool panduan1 = false;
bool p2 = false;
for(int k = 0;k<jilu;k++){
cin>>tmp.x>>tmp.y;
if(panduan(tmp.x, tmp.y, x1, y1, x2, y2)){
cishu++;
p2 = true;
}
else
cishu = 0;
if(cishu>=yuzhi){
panduan1 = true;
}
}
if(p2){
jingguo++;
}
if(panduan1){
jingbao++;
}
}
cout<<jingguo<<endl<<jingbao;
return 0;
}


20200601 线性分类器

解题思路

  • 通过直线分类,点不会出现在直线上,在上方时表达式大于零。
  • 建立struct描述点,建立数组存储点。
  • 判断是否每个点都被分类正确

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;

struct dian{
int x;
int y;
char type;
};

int main(){
int num1,num2;
cin>>num1>>num2;
dian kkk[num1];
for(int i = 0;i<num1;i++){
cin>>kkk[i].x>>kkk[i].y>>kkk[i].type;
}
for(int i = 0;i<num2;i++){
char up,down;
bool panduan = true;
up = 'c';
down = 'c';
int a,b,c;
cin>>a>>b>>c;
for(int k = 0;k<num1;k++){
if(a+b*kkk[k].x+c*kkk[k].y>0){
if(up == 'c'){
up = kkk[k].type;
}
else if(up != kkk[k].type){
cout<<"No"<<endl;
panduan = false;
break;
}
}
if(a+b*kkk[k].x+c*kkk[k].y<0){
if(down == 'c'){
down = kkk[k].type;
}
else if(down != kkk[k].type){
cout<<"No"<<endl;
panduan = false;
break;
}
}

}
if(panduan){
cout<<"Yes"<<endl;
}
}
return 0;
}

20200602 稀疏向量

解决

  • 最快的方式是使用map来进行解决,但由于对map库不是很熟练没有使用
  • 注意阅读题目要求,发现最终结果可能数字很大,会超出int类型的限制,所以一定要使用longlong类型,否则正确率只有60
  • 采用接收、配对,类似于merge的方法求和,注意不能使用双层循环,会超时
  • 题目感觉比第一题难度还低

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;

struct xiangl{
int u;
int v;
};

int main(){
int len,l1,l2;
cin>>len>>l1>>l2;
xiangl p1[l1];
xiangl p2[l2];
long long juanji = 0;
for(int i = 0;i<l1;i++){
cin>>p1[i].u>>p1[i].v;
}
for(int i = 0;i<l2;i++){
cin>>p2[i].u>>p2[i].v;
}
int i1 = 0;
int i2 = 0;
while(true){
if(i1>=l1||i2>=l2){
break;
}
else if(p1[i1].u == p2[i2].u){
juanji += p1[i1].v*p2[i2].v;
i1++;
i2++;
}
else if(p1[i1].u < p2[i2].u){
i1++;
}
else{
i2++;
}
}
cout<<juanji;
return 0;
}
/*
10 3 4
4 5
7 -3
10 1
1 10
4 20
5 30
7 40
输出:-20
*/

20190901 小明种苹果

解题思路

  • 两种求和运算,可以只保存下标用于记录被筛过最多的
  • 其他的就很简单,注意下标边界问题

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;

// 小明种苹果

struct pingguo{
int guoshi;
int shuguo;
};

int main(){
int num1, num2;// 种植数目和蔬果轮数
cin>>num1>>num2;
pingguo p[num1];
int index = 0;
int sum = 0;
for(int i = 0;i<num1;i++){
int tmp;
cin>>tmp;
int shu = 0;
for(int k = 0;k<num2;k++){
int shu1;
cin>>shu1;
shu += shu1;
}
p[i].guoshi = tmp+shu;
p[i].shuguo = 0 - shu;
sum += tmp+shu;
if(p[i].shuguo>p[index].shuguo){
index = i;
}
}
cout<<sum<<" "<<index+1<<" "<<p[index].shuguo;
return 0;

/*
3 3
73 -8 -6 -4
76 -5 -10 -8
80 -6 -15 0
输出:167 2 23
2 2
10 -3 -1
15 -4 0
输出:17 1 4
*/

}

20190902 小明种苹果2

解题思路

  • 数据输入范围很大,用longlong
  • 判断到重置数目时可以直接替换
  • 维护一个bool表保存是否发生掉落
  • 判断连续三个没有想出好的办法,边界处理使用了硬编码的方法

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <bits/stdc++.h>
using namespace std;

struct pingguo{
long long guoshi;
bool diaoluo;
};

int main(){
int num1;
cin>>num1;
pingguo p[num1];
long long sum = 0;
int D = 0;
int E = 0;
for(int i = 0;i<num1;i++){
p[i].diaoluo = false;
long long tmp;
int num2;
cin>>num2>>tmp;
for(int k = 0;k<num2-1;k++){
long long tmp2;
cin>>tmp2;
if(tmp2 > 0){
if(tmp2!=tmp){
p[i].diaoluo = true;
tmp = tmp2;
}
}
else{
tmp=tmp+tmp2;
}
}
if(p[i].diaoluo){
D++;
}
sum = sum + tmp;
}
if(num1>=3){
for(int i = 1;i<num1-1;i++){
if(p[i-1].diaoluo&&p[i].diaoluo&&p[i+1].diaoluo){
E++;
}
}
if(p[0].diaoluo&&p[1].diaoluo&&p[num1-1].diaoluo){
E++;
}
if(p[0].diaoluo&&p[num1-1].diaoluo&&p[num1-2].diaoluo){
E++;
}
}
cout<<sum<<" "<<D<<" "<<E;
return 0;

/*
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
输出:222 1 0
5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0
输出:39 4 2
*/
}

20190301 小中大

关于为什么很难拿满分

题目要求进行整数输出,估计自动检测输出的类型是否为int,只有中位数除不尽的情况下才使用float,这样就可以拿到满分,不然即使本地float输出为整数(表面上),也会判断输出错误。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <bits/stdc++.h>
using namespace std;

int main(){
vector<int> p;
int num;
cin>>num;
for(int i = 0;i<num;i++){
int tmp;
cin>>tmp;
p.push_back(tmp);
}
if(p[0]<p[num-1]){
cout<<p[num-1]<<" ";
if(num%2 == 0)
if((p[num/2]+p[num/2-1])%2==0)
cout<<(p[num/2]+p[num/2-1])/2<<" ";
else{
float tmp = p[num/2]+p[num/2-1];
cout<<tmp/2<<setprecision(1)<<" ";
}

else
cout<<(p[num/2])<<" ";
cout<<p[0];
}
else{
cout<<p[0]<<" ";
if(num%2 == 0)
if((p[num/2]+p[num/2-1])%2==0)
cout<<(p[num/2]+p[num/2-1])/2<<" ";
else{
float tmp = p[num/2]+p[num/2-1];
cout<<tmp/2<<setprecision(1)<<" ";
}

else
cout<<(p[num/2])<<" ";
cout<<p[num-1];
}
return 0;
/*
3
-1 2 4
输出:4 2 -1
4
-2 -1 3 4
输出:4 1 -2
*/
}

20190302 二十四点

解题思路

  • 题目给出的数据不会超过10,这就很方便我们进行编码运算
  • 用栈来实现计算器的模拟,这个数据结构有例题
  • 有关减法,建议存取+但是将数字计为复数,这样方便运算,虽然我没有采用这个方法,但是在这个地方吃了大亏
  • 对于存取顺序的出栈进栈,一定要找张纸写一写,因为写着写着自己就乱了

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<bits/stdc++.h>
using namespace std;

bool shiji(char a,char b){
return (b == 'x'||b == '/')||(((a == '+')||(a == '-'))&&((b == '+')||(b == '-')));
}

int main(){
stack<int> shuzi;
stack<char> fuhao;
int num;
cin>>num;
for(int i = 0;i<num;i++){
string s;
string::iterator ite;
vector<char> houzhui;
vector<char>::iterator ite2;
cin>>s;
for(ite = s.begin();ite!=s.end();ite++){
char tmp = *ite;
if(tmp>='0'&&tmp<='9'){
houzhui.push_back(tmp);
//cout<<tmp<<"进入数字";
}
else{
if(fuhao.empty()){
fuhao.push(tmp);
}
else if(shiji(tmp, fuhao.top())){
houzhui.push_back(fuhao.top());
fuhao.pop();
fuhao.push(tmp);
}
else{
fuhao.push(tmp);
}
}
}
while(!fuhao.empty()){
houzhui.push_back(fuhao.top());
fuhao.pop();
}
for(ite2 = houzhui.begin();ite2!=houzhui.end();ite2++){
char tmp = *ite2;
cout<<tmp;
if(tmp>='0'&&tmp<='9'){
shuzi.push(int(tmp)-48);
}
else{
if(tmp == '+'){
int kkk = shuzi.top();
shuzi.pop();
kkk = shuzi.top()+kkk;
shuzi.pop();
shuzi.push(kkk);
}
else if(tmp == '-'){
int kkk = shuzi.top();
shuzi.pop();
kkk = shuzi.top()-kkk;
shuzi.pop();
shuzi.push(kkk);
}
else if(tmp == 'x'){
int kkk = shuzi.top();
shuzi.pop();
kkk = shuzi.top()*kkk;
shuzi.pop();
shuzi.push(kkk);
}
else if(tmp == '/'){
int kkk = shuzi.top();
shuzi.pop();
kkk = shuzi.top()/kkk;
shuzi.pop();
shuzi.push(kkk);
}
}
}
//cout<<endl<<shuzi.top();
if(shuzi.top() == 24){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}

return 0;
}

20181201 小明上学

20181202 小明放学

思路

  • 用结构体节省一下传参输入
  • 建议先判断小明走到该路口路口的状态,再判断小明还需等多少时间

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <bits/stdc++.h>
using namespace std;

struct ryg{
int r;
int y;
int g;
};

int gettime(long long time,int a,int b,ryg p){
int all = p.g+p.r+p.y;
time = time%all;
// 先求状态
while(true){
if(time<b){
b = b-time;
break;
}
else{
time = time - b;
if(a == 1){
a = 3;
b = p.g;
}
else if(a == 2){
a = 1;
b = p.r;
}
else if(a == 3){
a = 2;
b = p.y;
}
}
}
if(a == 3){
return 0;
}
if(a == 1){
return b;
}
if(a == 2){
return b+p.r;
}

}

int main(){
ryg p;
cin>>p.r>>p.y>>p.g;
long long time = 0;
int num;
cin>>num;
for(int i = 0;i<num;i++){
int a,b;
cin>>a>>b;
if(a == 0){
time += b;
}
else{
int tmp = gettime(time,a,b,p);
//cout<<"需等待"<<tmp<<endl;
time += tmp;
}
}
cout<<time;
return 0;
}

/*
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3
*/

20180901 卖菜

思路

。。。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;

int main(){
vector<int> p;
vector<int> p1;
int num;
cin>>num;
for(int i = 0;i<num;i++){
int tmp;
cin>>tmp;
p.push_back(tmp);
}
for(int i = 0;i<num;i++){
int tmp;
if(i == 0){
tmp = (p[0]+p[1])/2;
cout<<tmp;
}
else{
cout<<" ";
if(i == num-1){
tmp = (p[num-1]+p[num-2])/2;
cout<<tmp;
}
else{
tmp = (p[i]+p[i-1]+p[i+1])/3;
cout<<tmp;
}
}
}
return 0;
}
/*
8
4 1 3 1 6 5 17 9
*/

20180902 买菜

思路

  • 法1,可以使用双层循环遍历
  • 法2,使用超大数组,将重叠时间赋特殊值
  • 使用了法2,体验很好

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;

int main(){
int num;
cin>>num;
int kkk = 1000000;
int time[kkk];
int count = 0;
for(int i = 0;i<kkk;i++) time[i] = 0;
for(int i = 0;i<num*2;i++){
int a,b;
cin>>a>>b;
for(int k = a+1;k<=b;k++){
time[k]++;
}
}
for(int i = 0;i<kkk;i++){
if(time[i] == 2)
count++;
}
cout<<count;
}
/*
4
1 3
5 6
9 13
14 15
2 4
5 7
10 11
13 14
*/

20180301 跳一跳

思路

  • 唯一的难点就是处理C++的输入问题,如果用python直接一句input().split(“ “)就自动生成char数组的了,可惜换不得。
  • 使用string接收一整行的输入,然后对一整行字符串进行处理
  • 要使用getline函数,不能使用cin,cin会自动把空格作为分割输入的标志,但getline不会
  • 确认连击的标准我们可以使用单独的变量来记录
  • 每次分数的表达式可以表示为 a或a+bx2的模式

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;

int main(){
string s;
getline(cin, s);
int count = 0;
int lianji = 0;
for(int i = 0;i<s.length();i = i+2){
if(s[i] == '1'){
count++;
lianji = 0;
}
if(s[i] == '2'){
count+= 2+lianji*2;
lianji++;
}
}
cout<<count;
return 0;
}

20180302 碰撞的小球

思路

唯一的困难就是判断小球是否碰撞,可以采用sort再碰撞就可以约束小球的碰撞范围,详解看代码注释

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <bits/stdc++.h>
using namespace std;
/*
问题的实际解决方法:
1.小球默认都是正向运动速度为1
2.小球发生碰撞我们可以将两个小球的编号交换,以此来代替碰撞的计算
3.处理输入的小球可以先进行排序在进行vector存储
4.永远不会出现三个小球碰撞或者两个小球同时碰壁的情况
*/
struct qiu{
int bianhao;
int weizhi;
int fangxiang;
};

void yidong(qiu a[],int n){
for(int i = 0;i<n;i++){
a[i].weizhi += a[i].fangxiang;
}
}

void pengzhuang(qiu a[],int n,int len){
if(a[0].weizhi == 0){
a[0].fangxiang = 1;
}
for(int i = 0;i<n-1;i++){
if(a[i].weizhi == a[i+1].weizhi){
int tmp = a[i].fangxiang;
a[i].fangxiang = a[i+1].fangxiang;
a[i+1].fangxiang = tmp;
}
}
if(a[n-1].weizhi == len){
a[n-1].fangxiang = -1;
}
}

int cmp(qiu a,qiu b){
return a.weizhi<b.weizhi;
}

int cmp1(qiu a,qiu b){
return a.bianhao<b.bianhao;
}

int main(){
//初始化
int num,len,time;
cin>>num>>len>>time;
qiu p[num];
for(int i = 0;i<num;i++){
p[i].bianhao = i+1;
p[i].fangxiang = 1;
cin>>p[i].weizhi;
}
sort(p,p+num,cmp);
//按秒开始移动
for(int i = 0;i<time;i++){
yidong(p,num);
pengzhuang(p,num,len);
}
sort(p,p+num,cmp1);
for(int i = 0;i<num;i++){
cout<<p[i].weizhi<<" ";
}
}

20171201 中位数

思路

这道题有两种做法,数组和map都可,详细解题过程在代码注释,这里不多做赘述,简单总结下map的方法

1
2
3
4
5
6
7
insert(pair(a,b));
count(key);
find(key);
erase(key);
size();
clear();
for(map<int,int>::iterator it = p.begin(); it!=p.end(); it++)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <bits/stdc++.h>
using namespace std;

//思路:
//1.可以使用数组进行判断,判断中位数是否存在,但是类型太多,很难进行判断。
//2.使用map进行统计,并借用map的数据结构性质进行排序,这是最好的方法,运算简单。

/*使用方法1,太复杂了放弃了。。。。。
int main(){
int num;
cin>>num;
int p[num];
for(int i = 0;i<num;i++){
cin>>p[i];
}
sort(p, p+num);
if(num == 1){
cout<<p[0];
return 0;
}
if(num == 2){
cout<<"-1";
return 0;
}
if(num%2==0){
int tmp = 0;
while(num/2-1-tmp>=0&&p[num/2-tmp-1]==p[num/2+tmp]){
tmp++;
}
if(p[num/2-tmp]==p[num/2-tmp]||p[num/2+tmp-1]==p[num/2+tmp]){
cout<<"-1";
return 0;
}
else{
cout<<p[num/2];
}
}
return 0;
}
*/

//方法2,map法
int main(){
int num;
cin>>num;
map<int,int> p;
for(int i = 0;i<num;i++){
int tmp;
cin>>tmp;
if(p.count(tmp) == 1){
p[tmp] += 1;
}
else{
p[tmp] = 1;
}
}
int tmp = 0;
for(map<int,int>::iterator it = p.begin(); it!=p.end(); it++){
int tt = tmp;
tmp += it->second;
if(tmp>num/2){
if(num%2 == 0){
if(num/2-tt==tmp-num/2){
cout<<it->first;
return 0;
}
else{
cout<<"-1";
return 0;
}
}
else{
if(num/2-tt+1 == tmp-num/2){
cout<<it->first;
return 0;
}
else{
cout<<"-1";
return 0;
}
}
}
}
return 0;
}

20170301 分蛋糕

思路

  • 不需要保存所有的记录,直接算更加简便
  • 后台第三个测试用例会出现正好分完的情况,所以我们不能最后盲目+1,要进行一层判断

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <bits/stdc++.h>
    using namespace std;

    int main(){
    int a,b;
    cin>>a>>b;
    int zong = 0;
    int num = 0;
    for(int i = 0;i<a;i++){
    int tmp;
    cin>>tmp;
    zong+=tmp;
    if(zong >= b){
    zong = 0;
    num++;
    }
    }
    if(zong != 0) num++;
    cout<<num;
    return 0;
    }

20170302 学生排队

思路

  • 相当于移位覆盖+换位
  • 用vector实现更加简单
  • 可以参考数据结构对于线性顺序表的相关定义

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;

int find(int a[], int v, int n){
for(int i = 0;i<n;i++){
if(a[i] == v){
return i;
}
}
return 0;
}

int main(){
int len;
cin>>len;
int p[len];
for(int i = 0;i<len;i++) p[i] = i+1;
int time;
cin>>time;
for(int i = 0;i<time;i++){
int xuehao,yidong;
cin>>xuehao>>yidong;
int kkk = find(p,xuehao,len);
int kkkk = p[kkk];
if(yidong > 0){
for(int k = kkk;k<kkk+yidong;k++){
p[k] = p[k+1];
}
}
else{
for(int k = kkk;k>kkk+yidong;k--){
p[k] = p[k-1];
}
}
p[kkk+yidong] = kkkk;
}
for(int i = 0;i<len;i++){
if(i == 0) cout<<p[i];
else cout<<" "<<p[i];
}
return 0;
}
/*
8
3
3 2
8 -3
3 -2
*/