【整活】OI的那些奇妙小操作(Part 1)

卡时

在C++里,有(double)clock()/CLOCKS_PER_SEC这一行代码可以获得当前已经运行的时间。
初见端倪,也就是说,当你使用一些暴力算法(暴搜)的时候,你可以通过计算当前已经运行的时间并判断是否将要超时,如果要超时就直接输出目前的最好策略,如:

核桃OJ CSP-S模拟赛 P10771 抓娃娃

#include<bits/stdc++.h>
#define int long long
using namespace std;

constexpr int maxn=2e6;
int T;
int n, m;

struct mat {
    vector<vector<int>> a;
    mat(int width, int height, int init=1){
        a.resize(height);
        for(int i=0;i<height;i++) {
            a[i].resize(width);
            for(int j=0;j<a[i].size();j++)
                a[i][j]=init;
        }
    }
    mat operator*(const mat& T) const {
        mat res(n, 1, 0);
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                res.a[0][i]+=a[0][j]*T.a[j][i];
            }
        }
        return res;
    }
};

signed main() {
    freopen("xcx.in","r",stdin);
    freopen("xcx.out","w",stdout);
    scanf("%lld",&T);
    for(int _=1;_<=T;_++) {
        scanf("%lld%lld",&n,&m);
        mat init(n,1), mult(n,n,0);
        while(m--) {
            int x, y;
            scanf("%lld%lld",&x,&y);
            mult.a[x-1][y-1]=1;
        }
        int res=0;
        double start=(double)clock()/CLOCKS_PER_SEC;
        while(++res) {
            init = init*mult;
            int num=0;
            for(int ele : init.a[0]) {
                if(ele!=0) num+=1;
                if(num==2) break;
            }
            if(num==1) {
                puts("Let's play");
                printf("%lld\n",res);
                break;
            } else if((double)clock()/CLOCKS_PER_SEC - start >= (1.0/T)) {
                puts("Poor cx");
                break;
            }
        }
    }
    return 0;
}

静态内存计算

bool start;
/* 变量定义 */
bool end;

// 输出end - start可以得到变量的静态内存,以MB为单位
posted @ 2025-10-20 13:19  Kibrel  阅读(16)  评论(0)    收藏  举报