还是要注意自己构建数据测试。
最大连续子序列
前缀和
#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;}
