组队
 
#include<stdio.h>
int main(void) {
    freopen("team.txt","r",stdin);
    int a[21][6];
    for(int i=1; i<=20; ++i)
        for(int j=0; j<=5; ++j)//每个人前面有一个序号 
            scanf("%d",&a[i][j]);
    int ans=0;
    for(int i1=1; i1<=20; ++i1) {
        for(int i2=1; i2<=20; ++i2) {
            if(i2==i1)continue;
            for(int i3=1; i3<=20; i3++) {
                if(i3==i1||i3==i2)continue;
                for(int i4=1; i4<=20; ++i4) {
                    if(i4==i1||i4==i2||i4==i3)continue;
                    for(int i5=1; i5<=20; ++i5) {
                        if(i5==i1||i5==i2||i5==i3||i5==i4)continue;
                        if(a[i1][1]+a[i2][2]+a[i3][3]+a[i4][4]+a[i5][5]>ans)ans=a[i1][1]+a[i2][2]+a[i3][3]+a[i4][4]+a[i5][5];
                    }
                }
            }
        }
    }
    printf("%d\n",ans);//490 
    return 0;
} #include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
const int n=20;
const int m=5;
int a[n+1][m+1];
int vis[m+1];
int ans=0;
void dfs(int lv,int sum) {
    if(lv==6) {
        ans=max(ans,sum);
        return;
    }
    for(int i=1; i<=n; ++i) {
        bool f=0;
        for(int j=1; j<lv; ++j) {
            if(vis[j]==i) {
                f=1;
            }
        }
        if(!f) {
            vis[lv]=i;
            dfs(lv+1,sum+a[i][lv]);
        }
    }
}
int main() {
    for(int i=1; i<=20; ++i)
        for(int j=0; j<=5; ++j)//每个人前面有一个序号
            scanf("%d",&a[i][j]);
    dfs(1,0);
    cout << ans << endl;
} 年号字串
 
#include<algorithm>
#include<iostream>
using namespace std;
int main() {
    int a;
    while(cin>>a) {
        string ans="";
        while(a) {
            --a;//精髓
            ans+='A'+a%26;
            a/=26;
        }
        reverse(ans.begin(),ans.end());
        cout<<ans<<endl;//BYQ
    }
    return 0;
} 数列求值
 
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int a=1,b=1,c=1,d;
int main() {
    for(int i=4;i<=20190324;++i){
        d=(a+b+c)%10000;
        a=b,b=c,c=d;
    }cout<<d<<endl;//4659
    return 0;
} 数的分解
 
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
bool chk(int n) {
    for (; n; n /= 10)
        if (n % 10 == 2 || n % 10 == 4) return 0;
    return 1;
}
int main() {
    int cnt = 0;
    for (int i = 1999; i >= 673; --i) {
        if (chk(i))
            for (int j = 2; j < i && i + j < 2019; ++j) {
                int k = 2019 - i - j;
                if (i > j && j > k && chk(j) && chk(k)) ++cnt;
            }
    }
    printf("%d\n", cnt);  // 40785
    return 0;
} 迷宫
 
01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001100110100101 01111011010010001000001101001011100011000000010000 01000000001010100011010000101000001010101011001011 00011111000000101000010010100010100000101100000000 11001000110101000010101100011010011010101011110111 00011011010101001001001010000001000101001110000000 10100000101000100110101010111110011000010000111010 00111000001010100001100010000001000101001100001001 11000110100001110010001001010101010101010001101000 00010000100100000101001010101110100010101010000101 11100100101001001000010000010101010100100100010100 00000010000000101011001111010001100000101010100011 10101010011100001000011000010110011110110100001000 10101010100001101010100101000010100000111011101001 10000000101100010000101100101101001011100000000100 10101001000000010100100001000100000100011110101001 00101001010101101001010100011010101101110000110101 11001010000100001100000010100101000001000111000010 00001000110000110101101000000100101001001000011101 10100101000101000000001110110010110101101010100001 00101000010000110101010000100010001001000100010101 10100001000110010001000010101001010101011111010010 00000100101000000110010100101001000001000000000010 11010000001001110111001001000011101001011011101000 00000110100010001000100000001000011101000000110011 10101000101000100010001111100010101001010000001000 10000010100101001010110000000100101010001011101000 00111100001000010000000110111000000001000000001011 10000001100111010111010001000110111010101101111000
#include <cstring>
#include <iostream>
#include <queue>
#define sc(x) scanf("%d", &(x))
const int ax[4] = {1, 0, 0, -1};
const int ay[4] = {0, -1, 1, 0};
const char dir[5] = {'D', 'L', 'R', 'U'};
int maze[105][105];
int X, Y;
using namespace std;
struct point {
    int x, y;
    string ans;
    point(int a, int b, string c) : x(a), y(b), ans(c) {}
};
bool judge(int x, int y) {
    if (x > 0 && x <= X && y > 0 && y <= Y && !maze[x][y]) return true;
    return false;
}
void bfs() {
    queue<point> ans;
    ans.push(point(1, 1, ""));
    while (!ans.empty()) {
        point temp = ans.front();
        ans.pop();
        if (temp.x == X && temp.y == Y) {//抵达终点
            cout << temp.ans << endl;
            return;
        }
        for (int i = 0; i < 4; i++) {
            int tempx = temp.x + ax[i];
            int tempy = temp.y + ay[i];
            if (judge(tempx, tempy)) {
                maze[tempx][tempy] = 1;//不走回头路
                ans.push(point(tempx,tempy,temp.ans+dir[i]));
            }
        }
    }
}
int main() {
    freopen("maze.txt","r",stdin);
    X = 30, Y = 50;
    for (int i = 1; i <= X; i++) {
        for (int j = 1; j <= Y; j++) {
            char t= getchar();
            maze[i][j] = t-'0';
        }
        getchar();
    }
    bfs();
    return 0;
} DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR
特别数的和
 
打表可以进行常数级别的优化。大约可以把时间降低到1/3到1/4。
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
bool chk(int n) {
    for (; n; n /= 10)
        if (n % 10 == 2 ||n % 10 ==0||n % 10 ==1|| n % 10 == 9) return 1;
    return 0;
}
int main() {
    ll n;
    while(~scanf("%lld",&n)) {
        ll ans=0;
        for(int i=1; i<=n; ++i)
            if(chk(i))ans+=i;
        printf("%lld\n",ans);
    }
    return 0;
} 完全二叉树的权值
 
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+7;
ll a[N];
int main() {
    ll n;
    while(~scanf("%lld",&n)) {
        for(int i=1; i<=n; ++i)scanf("%lld",&a[i]);
        ll ans=1,maxx=a[1],p=2,lv=1;
        while(p<=n) {
            ++lv;
            ll now=0;
            for(int i=0; i<(1<<(lv-1))&&p<=n; ++i)now+=a[p++];
            if(now>maxx)ans=lv,maxx=now;
        }
        printf("%lld\n",ans);
    }
    return 0;
} 等差数列
 
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e5+7;
ll a[N],d[N];
int main() {
    ll n,m;
    while(~scanf("%lld",&n)) {
        for(int i=1; i<=n; ++i)scanf("%lld",&a[i]);
        sort(a+1,a+1+n);
        for(int i=1; i<n; ++i) d[i]=a[i+1]-a[i];
        if(!d[1]) {
            printf("%lld\n",n);
            continue;
        }
        ll c=__gcd(d[1],d[2]);
        for(int i=3; i<n; ++i) c=__gcd(c,d[i]);
        ll ans=(a[n]-a[1])/c+1;
        printf("%lld\n",ans);
    }
    return 0;
} 后缀表达式
 
#include <algorithm>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 2e5 + 7;
ll n, m, a[N];
int main() {
    while (cin >> n >> m) {
        for (int i = 0; i <= n + m; ++i) scanf("%lld", &a[i]);
        sort(a, a + n + m + 1);
        int L = 0, R = n + m;
        ll ans = 0;
        bool f = a[L] < 0 && m;
        while (a[L] < 0 && m) {
            if (m > 1 || a[L + 1] >= 0 && m == 1 || !n) --m;
            else --n;
            ans -= a[L++];
        }
        ans += a[R--];
        while (R >= L && n) ans += a[R--], --n;
        if (m) {
            if (!f) ans -= a[L++], --m;
            while (R >= L && m) ans += a[R--], --m;
        }
        printf("%lld\n", ans);
    }
    return 0;
} #include <algorithm>
#include <cstdio>
#include <iostream>
#define sc(x) scanf("%lld", &(x))
using namespace std;
typedef long long ll;
const int N = 2e5 + 7;
ll n, m, a[N];
int main() {
    while (cin >> n >> m) {
        ll sum = n + m + 1;
        for (int i = 0; i < sum; ++i) sc(a[i]);
        sort(a, a + sum);
        int L = 0, R = sum - 1;
        ll ans = 0;
        bool f = 0;
        while (a[L] < 0 && m) {
            f = 1;
            if (m > 1)  // 当减号数量大于1的时候,优先用减号,将负数转化为正数
                ans -= a[L++], --m;
            else if (a[L + 1] >= 0 && m == 1 || !n)  //如果下一个数是正数而且负号只剩一个
                                                     //那就用这个减号来把手上的负数变号
                                                     //或者正号耗尽 别无选择
                ans -= a[L++], --m;
            else if (n)  //有减号的话,就可以把加号当减号用,将负数转化为正数
                ans -= a[L++], --n;
        }
        ans += a[R--];
        while (R >= L && n)
            ans += a[R--], --n;  //如果还有加号剩余,那么就用加号加大的数
        if (m) {                 //如果还有减号
            if (f)  //如果之前对负数用过减号,那么就可以把减号当加号用,对正数操作
                while (R >= L && m) ans += a[R--], --m;
            else {  //如果没有,就减去最小的,这样就可以负负得正了
                ans -= a[L++], --m;
                while (R >= L && m) ans += a[R--], --m;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
} 除了以下情况,其他情况均为绝对值相加:
- 没有减号(全部相加)
- 全是负数(减去最大的值 其余相加)
- 全是正数(减去最小的值 其余相加)
灵能传输
 
混分代码
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N=3e5+7;
ll a[N];
void dr(int i) {
    a[i-1]+=a[i],a[i+1]+=a[i],a[i]=-a[i];
}
int main() {
    ll n,T;
    scanf("%lld",&T);
    while(T--) {
        scanf("%lld",&n);for(int i=1; i<=n; ++i)scanf("%lld",&a[i]);
        for(int i=2;i<n;++i){
            ll ori=max(abs(a[i-1]),abs(a[i+1]));
            ll aft=max(abs(a[i-1]+a[i]),abs(a[i+1]+a[i]));
            if(ori>aft)dr(i);
        }
        printf("%lld\n",*max_element(a+1,a+n+1));
    }
    return 0;
} 
 京公网安备 11010502036488号
京公网安备 11010502036488号