SWPUACM第二次周赛

Posted MangataTS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SWPUACM第二次周赛相关的知识,希望对你有一定的参考价值。

文章目录

A.打卡,下班!

用栈模拟,区域赛签到题,详情请看代码,数据可能有问题,被暴力A了,下面是正解

#include<cstdio>
using namespace std;

const int N = 100005;
int ans[N],a[N],S[N];

int main()

    int n;
    scanf("%d",&n);
    for(int i = 1;i <= n; ++i) 
        scanf("%d",&a[i]);
    
    int loc = 0;
    for(int i = 1;i <= n; ++i) 
        while(loc && a[i] > a[S[loc]]) 
            ans[S[loc]] = i;
            --loc;
        
        S[++loc] = i;
    
    for(int i = 1;i <= n; ++i) 
        printf("%d%c",ans[i],i==n?'\\n':' ');
    
    return 0;

B.组合判断

预处理

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<cstdlib>
#include<ctime>

using namespace std;
#define ll long long

int t;
ll x;
map<ll,bool> mp;

int main()

    srand((int)time(0));
    for(ll i = 1;i <= 10000; ++i) 
        mp[i*i*i*i] = true;
    
    scanf("%d",&t);
    while(t--) 
        scanf("%lld",&x);
        bool fg = false;
        for(ll i = 1;i <= 10000; ++i) 
            if(mp[x-i*i*i*i]) 
                fg = true;
                break;
            
            if(x-i*i*i*i < 0)
                break;
        
        if(fg) 
            puts("YES");
        
        else 
            puts("NO");
        
    
    return 0;

C.点菜吃饭

01背包变形

#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int dp[maxn],a[105],n,m;
int main(void)

    cin>>n>>m;
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=n;++i)
        cin>>a[i];
    dp[0]=1;
    for(int i=1;i<=n;++i)
        for(int j=m;j>=0;--j)
            if(j>=a[i])
            dp[j]+=dp[j-a[i]];
    cout<<dp[m]<<endl;
    return 0;

D.简单斐波那契数列

矩阵快速幂,这个超范围了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
using namespace std;
const long long N = 2;
const long long mod = 1e9 + 7;
long long n, k;

struct mat 
    long long m[N + 1][N + 1];
    mat() 
        memset(m, 0, sizeof(m));
        for(int i = 1; i <= N; i++)
            m[i][i] = 1;
    
;

//矩阵乘法
mat multi(mat a, mat b) 
    mat c;
    memset(c.m, 0, sizeof(c.m));
    for(int i = 1; i <= N; i++) 
        for(int j = 1; j <= N; j++) 
            for(int k = 1; k <= N; k++) 
                c.m[i][j] += a.m[i][k] * b.m[k][j] % mod;
                c.m[i][j] %= mod;
            
        
    
    return c;

//矩阵快速幂
mat fastpow(mat a, long long k) 
    mat res;
    while(k) 
        if(k & 1) res = multi(a, res);
        a = multi(a, a);
        k >>= 1;
    
    return res;

int main() 
    cin >> n;
    mat x;
    memset(x.m, 0, sizeof(x.m));
    x.m[1][1] = x.m[1][2] = x.m[2][1] = 1;
    mat ans;
    ans = fastpow(x, n - 1);
    printf("%lld\\n", ans.m[1][1]);


    return 0;

E.傻蛋

简单的博弈论,傻蛋必输

#include<cstdio>
#include<iostream>
using namespace std;
int main() 
    int t;
    cin>>t;
    while(t--)puts("0");
    return 0;

以上是关于SWPUACM第二次周赛的主要内容,如果未能解决你的问题,请参考以下文章

AcWing第2次周赛——第二题(3627. 最大差值 )贪心策略

企业订餐系统(第二次周总结)

第二次周总结

第三次周赛 总结:是的,我在进步中。。。

2019下学期第二次个人周赛—A题

SWPUACM第二届程序设计竞赛