先说一下,这几天不会再更新,我会尽量抽时间更新后面的题解,抱歉。
2160
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N][N];
typedef long long LL;
LL f[N][N];
int n, m;
int main(){
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
scanf("%d", &a[i][j]);
}
}
memset(f, -0x7f, sizeof(f));
LL ma;
f[1][0] = 0;
for(int j=1; j<=m; j++){
ma = -1e18;
for(int i=1; i<=n; i++){
ma = max(ma, f[i][j-1]) + a[i][j];
f[i][j] = max(f[i][j], ma);
}
ma = -1e18;
for(int i=n; i>=1; i--){
ma = max(ma, f[i][j-1]) + a[i][j];
f[i][j] = max(f[i][j], ma);
}
}
cout << f[n][m];
return 0;
}
1229
#include<bits/stdc++.h>
using namespace std;
int a[1100],n,i,j,x,p,k = 0;
int main()
{
cin>>n;
for (i = 1;i <= n; i++)
{
cin>>x;
p = -1;
for (j = 1;j <= k; j++)
{
if (a[j] >= x)
{
p = j;
break;
}
}
if (p != -1)
{
a[p] = x;
}else{
k++;
a[k] = x;
}
}
cout<<k;
return 0;
}
//syy24222
1375
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[1010]={},c=0,sum,temp;
bool isFind=false;
vector< vector<int> > v;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
while(!isFind){
temp=INT_MAX;
if(c == v.size()) v.push_back(vector<int>());
sum=0;
for(int i=0;i<n;i++){
if(a[i]==0) continue;
sum+=a[i];
if(temp>a[i]){
temp=a[i];
v[c].push_back(a[i]);
a[i]=0;
}
}
if(0==sum){
isFind=true;
}else{
++c;
}
}
cout<<c<<endl;
for(int i=0;i<c;i++){
cout<<i+1<<":";
for(int j=0;j<v[i].size();j++){
cout<<v[i][j];
if(j!=v[i].size()-1) cout<<" ";
}
cout<<endl;
}
return 0;
}
1336
#include <iostream>
#include <sstream>
#include <algorithm>
using namespace std;
int gcd(int a, int b) {
while (b!= 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
void simplify(int& numerator, int& denominator) {
int divisor = gcd(abs(numerator), denominator);
numerator /= divisor;
denominator /= divisor;
if (denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
}
int main() {
string expression;
cin >> expression;
int slash1 = expression.find('/');
int slash2 = expression.find('/', slash1 + 1);
int plusMinus = expression.find('+', slash1 + 1);
if (plusMinus == string::npos) {
plusMinus = expression.find('-', slash1 + 1);
}
int numerator1 = stoi(expression.substr(0, slash1));
int denominator1 = stoi(expression.substr(slash1 + 1, plusMinus - slash1 - 1));
int numerator2 = stoi(expression.substr(plusMinus + 1, slash2 - plusMinus - 1));
int denominator2 = stoi(expression.substr(slash2 + 1));
int commonDenominator = denominator1 * denominator2;
int newNumerator;
if (expression[plusMinus] == '+') {
newNumerator = numerator1 * denominator2 + numerator2 * denominator1;
} else {
newNumerator = numerator1 * denominator2 - numerator2 * denominator1;
}
simplify(newNumerator, commonDenominator);
if (newNumerator == 0) {
cout << 0;
} else if (commonDenominator == 1) {
cout << newNumerator;
} else {
cout << newNumerator << "/" << commonDenominator;
}
return 0;
}
//一堆乱码,笑死我了
1339
#include <iostream>
#include <string>
using namespace std;
// 两个数的最大公约数
int gcd(int a,int b){
if(a%b==0){
return b;
}
return gcd(b,a%b);
}
// 求两个分数的和,结果为分数
string he(string s1,string s2){
// 1/12
// 0123
string r;
int x1,y1,x2,y2,x,y;
int p1 = (int)s1.find('/');
int p2 = (int)s2.find('/');
x1 = stoi(s1.substr(0,p1));
y1 = stoi(s1.substr(p1+1,s1.size()-1-p1));
x2 = stoi(s2.substr(0,p2));
y2 = stoi(s2.substr(p2+1,s2.size()-1-p2));
y = y1*y2;
x = x1*y2 + x2*y1;
// 求最大公约数
int m = gcd(x,y);
x = x/m;
y = y/m;
return to_string(x)+"/"+to_string(y);
}
string s,r,sum="0/1";
int i;
int main() {
// cout<<he("1/12", "5/12");
cin>>s;
for(i=0;i<s.size();i++){
if(s[i]!='+'){
r += s[i];
if(i==s.size()-1 || s[i+1]=='+'){
// cout<<r<<endl;
sum = he(sum, r);
r.clear();
}
}
}
// cout<<sum<<endl;
int sum_x,sum_y;
int p = (int)sum.find('/');
sum_x = stoi(sum.substr(0,p));
sum_y = stoi(sum.substr(p+1,sum.size()-1-p));
if(sum_x==sum_y){
cout<<1<<endl;
}else if(sum_x%sum_y==0){
cout<<sum_x/sum_y<<endl;
}else{
cout<<sum<<endl;
}
return 0;
}
1358
#include<bits/stdc++.h>
using namespace std;
int a[20];
bool f[20];
int n,cnt=0;
bool isprime(int n){
if(n<=1) return false;
for(int i=2; i<=sqrt(n); i++)
if(n%i==0) return false;
return true;
}
void print(){
cnt++;
cout << cnt << ':';
for(int i=1; i<=n; i++){
cout << a[i] << ' ';
}
cout << endl;
}
void dfs(int k){
int i;
for(i=1; i<=n; i++){
if(!f[i] && (k==1 || isprime(i+a[k-1]))){
a[k] = i;
if(k==n && isprime(a[k]+a[1])){
print();
}else{
f[i] = true;
dfs(k+1);
f[i] = false;
}
}
}
}
int main(){
cin >> n;
dfs(1);
cout << "total:" << cnt;
return 0;
}
1362
#include<iostream>
using namespace std;
bool a[5][9]; //标记坐标是否走过
int b[50][2]; //保存步骤坐标
int c= 0;
int fx[4] = {2, 1, -1, -2};
int fy[4] = {1, 2, 2, 1};
void print(int k)
{
c++;
printf("%d:", c);
for(int i = 1; i < k; i++)
{
printf("%d,%d->", b[i][0], b[i][1]);
}
printf("%d,%d\n", b[k][0], b[k][1]);
}
void dfs(int x, int y, int k)
{
b[k][0] = x;
b[k][1] = y;
for(int i = 0; i < 4; i++)
{
int dx = x + fx[i];
int dy = y + fy[i];
if(dx >= 0 && dx <= 4 && dy >= 0 && dy <= 8 && a[dx][dy] == false)
{
b[k+1][0] = dx;
b[k+1][1] = dy;
a[dx][dy] = true;
if(dx == 4 && dy == 8)
{
print(k+1);
}else
{
dfs(dx, dy, k+1);
}
a[dx][dy] = false;
}
}
}
int main()
{
a[0][0] = true;
dfs(0, 0, 1);
return 0;
}
1364
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,m;
int s1=0,s2=0,s3=0,s=0;
cin >> n >> m;
for(int i=0; i<min(n,m); i++){
s1 += (m - i) * (n - i);
}
for(int i=1; i<=n; i++){
s2 += i;
}
for(int i=1; i<=m; i++){
s3 += i;
}
s2 = s2 * s3 - s1;
cout << s1 << ' ' << s2 << endl;
return 0;
}
1368
#include<bits/stdc++.h>
using namespace std;
//当n-m的值较大时需要高精度运算
string he(string s1,string s2){
string r;//存放总和
int a[1000] = {0};
int b[1000] = {0};
int c[1000] = {0};
//逆序存入整数数组
int i;
for(i = 0;i < s1.size();i++){
a[i] = s1[s1.size() - i - 1] - '0';
}
for(i = 0;i < s2.size();i++){
b[i] = s2[s2.size() - i - 1] - '0';
}
//逐位相加,逐位进位
int len = s1.size();
if(s2.size() > s1.size()) len = s2.size();
for(i = 0;i < len;i++){
c[i] = c[i] + a[i] + b[i];
if(c[i] >= 10){
c[i+1] = c[i+1] + c[i] / 10;
c[i] = c[i] % 10;
}
}
//判断是否多出1位
if(c[len] != 0) len++;
//逆序将c数组拼接乘字符串
for(i = len-1;i>=0;i--){
//将c[i]+'0'这个ascii码强制转换为char类型
r = r + (char)(c[i] + '0');
}
return r;
}
int main(){
int m,n,i,j;
cin>>m>>n;
i = n - m;
string x,y,z;
x = "1";
y = "1";
if(i==1){
cout<<x;
}else if(i==2){
cout<<y;
}else{
for(j=3;j<=i+1;j++){
z = he(x,y);
x = y;
y = z;
}
cout<<z;
}
return 0;
}
1369
#include <bits/stdc++.h>
using namespace std;
/*
An = A(n-1)*2 + A(n-2)
*/
//求两个高精度的整数的和
string he(string s1,string s2){
string r;//存放总和
int a[1000] = {0};
int b[1000] = {0};
int c[1000] = {0};
//逆序存入整数数组
int i;
for(i = 0;i < s1.size();i++){
a[i] = s1[s1.size() - i - 1] - '0';
}
for(i = 0;i < s2.size();i++){
b[i] = s2[s2.size() - i - 1] - '0';
}
//逐位相加,逐位进位
int len = s1.size();
if(s2.size() > s1.size()) len = s2.size();
for(i = 0;i < len;i++){
c[i] = c[i] + a[i] + b[i];
if(c[i] >= 10){
c[i+1] = c[i+1] + c[i] / 10;
c[i] = c[i] % 10;
}
}
//判断是否多出1位
if(c[len] != 0) len++;
//逆序将c数组拼接乘字符串
for(i = len-1;i>=0;i--){
//将c[i]+'0'这个ascii码强制转换为char类型
r = r + (char)(c[i] + '0');
}
return r;
}
//求一个高精度的整数 * 2的积
string cheng(string s){
string r;
int a[1000] = {0};
int i;
//逆序存入a数组
for(i = 0;i < s.size();i++){
a[i] = s[s.size() - i - 1] - '0';
}
//逐位*2
for(i = 0;i < s.size();i++){
a[i] = a[i] * 2;
}
//逐位进位
for(i = 0;i < s.size();i++){
if(a[i] >= 10){
a[i+1] = a[i+1] + a[i] / 10;
a[i] = a[i] % 10;
}
}
//判断是否多一位
int len = s.size();
if(a[len] != 0) len++;
//逆序拼接到字符串r上
for(i = len - 1;i >= 0;i--){
r = r + to_string(a[i]);
}
return r;
}
int main(){
//z:代表计算结果,xy代表z的前两项
string x,y,z;
int i,n;
cin>>n;
//A(n)=A(n-1)*2+A(n-2)
x = "1";
y = "2";
if(n == 1){
cout<<x;
} else if(n == 2){
cout<<y;
} else{
//从第3项开始递推
for(i = 3;i <= n;i++){
z = he(cheng(y),x);
//修改xy的值,逐步向后推导
x = y;
y = z;
}
cout<<z;
}
}