202012-1
问题描述
解决
这个题目过于简单,只有题目的描述方式会让人反应一会,简单来说就是获取每两项的乘积之和,判断和0的关系,最后输出对应的结果。直接上代码
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#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
问题描述
解决
预设阈值,预测结果,和真实结果进行比较,根据最终预测准确率的高低选出最合适的阈值,理解起来比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
| #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; }
|
收获
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; }
|
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;
}
|
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;
}
|
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); time += tmp; } } cout<<time; return 0; }
|
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;
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;
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; }
|