真题
还是要注意自己构建数据测试。
最大连续子序列
前缀和
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<int> P(n);
for(int i = 0; i<n;i++){
cin >> P[i];
}
vector<int> prefix(n);
prefix[0] = P[0];
for(int i =1;i<n;i++){
prefix[i] = prefix[i-1]+P[i];
}
//for(int x:prefix)cout << x << " ";
//cout << endl;
int minidx = 0;
int maxidx = 0;
for(int i = 0; i<n;i++){
if(prefix[maxidx]<prefix[i]){
maxidx = i;//最大前缀和
}
}
for(int i = 0; i<maxidx;i++){
if(prefix[minidx]>prefix[i]){//找最小前缀和且在最大前缀和之前
minidx = i;
}
}
//cout << maxidx << " " << minidx << " ";
if(prefix[minidx]<0&&minidx!=maxidx){//小于0且两个不相等
cout << prefix[maxidx] - prefix[minidx];
return 0;
}else{
cout << prefix[maxidx];
return 0;
}
return 0;
}
众数问题
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<int> P(n);
for(int i = 0; i < n; i++){
cin >> P[i];
}
sort(P.begin(),P.end());
vector<int> fp;
int now = P[0];
int c = 0;
fp.push_back(0);
for(int i = 1; i < n; i++){
if(now!=P[i]){
now = P[i];
fp.push_back(i);
}
}
//差最大的就是最多的
int m = fp[0];
int idx = 0;
for (int i = 1; i <fp.size() ; i++)
{
//cout<<fp[i]<<" ";
if(m<fp[i]-fp[i-1]){
m = fp[i]-fp[i-1];
idx = fp[i-1];
}
}
cout<<P[idx];
return 0;
}
A 与 B 得到 C
签到
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a, b, c;
cin >> a >> b >> c;
if(a+b==c||a-b==c||a*b==c){
cout << "YES";
}else{
if(b!=0){
if(a/b==c){
cout <<"YES";
return 0;
}
}
cout << "NO";
}
return 0;
}
一元一次方程
字符串处理,处理左边和右边的系数然后解决就行。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string fc;
cin >> fc;
int lx = 0;
int rx = 0;
int lc = 0;
int rc = 0;
int p = 0;
int flag = 1;
while(fc[p]!='='){
if(fc[p]<='9'&&fc[p]>='0'){
if(p>0){
flag = fc[p-1]=='+'?1:-1;
}//判断符号
int now = p;
while(fc[now]!='x'&&fc[now]!='+'&&fc[now]!='-'&&fc[now]!='='){
now++;
}//判断是x还是常数
int num = 0;
num += fc[p] - '0';
p++;
while(p<now){
num *= 10;
num += fc[p] - '0';
p++;
}//计算对应数字
if(fc[now]=='x'){
lx += flag * num;
}else{
lc += flag * num;
}
}
else if(fc[p]=='x'){
if(p>0){
flag = fc[p-1]=='+'?1:-1;
}
lx += flag * 1;
}
if(fc[p]=='='){
break;
}
p++;
}
p++;
flag = 1;
while(fc[p]!='\0'){
if(fc[p]<='9'&&fc[p]>='0'){
if(fc[p-1]!='='){
flag = fc[p-1]=='+'?1:-1;
}//判断符号
int now = p;
while(fc[now]!='x'&&fc[now]!='+'&&fc[now]!='-'&&fc[now]!='\0'){
now++;
}//判断是x还是常数
int num = 0;
num += fc[p] - '0';
p++;
while(p<now){
num *= 10;
num += fc[p] - '0';
p++;
}//计算对应数字
if(fc[now]=='x'){
rx += flag * num;
}else{
rc += flag * num;
}
}
else if(fc[p]=='x'){
if(fc[p-1]!='='){
flag = fc[p-1]=='+'?1:-1;
}
rx += flag * 1;
}
if(fc[p]=='\0')break;
p++;
}
int x;
x = lx - rx;
int c;
c = rc - lc;
if(x==0&&c!=0){
cout << "no solution";
return 0;
}
if(x==0&&c==0){
cout << "infinite solutions";
return 0;
}
x = c/x;
cout << "x="<<x;
return 0;
}
前中后遍历
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
//前中后,根左右
struct Node{
int L;
int R;
};
int root;
vector<Node> P;
vector<int> prep, midp, hindp;
void pre(int root){
if(root == -1)return;
prep.push_back(root);
pre(P[root].L);
pre(P[root].R);
}
void mid(int root){
if(root == -1)return;
mid(P[root].L);
midp.push_back(root);
mid(P[root].R);
}
void hind(int root){
if(root == -1)return;
hind(P[root].L);
hind(P[root].R);
hindp.push_back(root);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
P.resize(n);
int F,L,R;
vector<bool> isroot(n,true);
for(int i = 0; i < n; i++){
cin >> F >> L >> R;
P[F].L = L;
P[F].R = R;
if(L!=-1)isroot[L] = false;
if(R!=-1)isroot[R] = false;
}
for(int i = 0; i < n; i++){
if(isroot[i]){
root = i;
break;
}
}
pre(root);
mid(root);
hind(root);
for(int x:prep)cout << x << " ";
cout <<endl;
for(int x:midp)cout << x << " ";
cout <<endl;
for(int x:hindp)cout << x << " ";
cout <<endl;
return 0;
}
跳台阶问题
#include <iostream>
using namespace std;
int c=0;
void check(int x){
if(x==1){
c+=1;
return;
}
if(x==2){
c+=2;
return;
}
check(x-1);
//c+=1;
check(x-2);
//c+=1;
}
int main() {
int n;
cin >> n;
check(n);
cout << c;
return 0;
}
我这个是全局变量方法。还可以用dp方法。
#include <iostream>
#include <vector>
using namespace std;
vector<int> P;
void check(int x){
P[0] = 0;
P[1] = 1;
P[2] = 2;
for(int i = 3; i <= x; i++){
P[i] = P[i-1] + P[i-2];
}
}
int main() {
int n;
cin >> n;
P.resize(n+1);
check(n);
cout << P[n];
return 0;
}
浙公网安备 33010602011771号