码迷,mamicode.com
首页 > 其他好文 > 详细

[Offer收割] 编程练习赛1

时间:2018-05-16 13:07:53      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:class   its   onclick   width   targe   debug   offer   queue   put   

A HihoCoder 1268 九宫

 思路:

  一般类似于数独的题目都是使用回溯解决,这里由于题目数据较小同样可以直接DFS得出结果。这里我用了一个偷懒的方法(next_permutation),直接求出全排列,然后将位置一一对应。

技术分享图片
// Asimple
#include <bits/stdc++.h>
#define debug(a) cout<<#a<<" = "<<a<<endl
#define sysp system("pause")
using namespace std;
typedef long long ll;
const int maxn = 200000 + 5;
ll T, n, sum, num, m, t, len, ans;
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int res[3][3], Map[3][3], temp[3][3];

bool check() {
    if( 
        a[0]+a[1]+a[2] == a[3]+a[4]+a[5] &&
        a[3]+a[4]+a[5] == a[6]+a[7]+a[8] &&
        a[6]+a[7]+a[8] == a[0]+a[4]+a[8] &&
        a[0]+a[4]+a[8] == a[2]+a[4]+a[6] &&
        a[2]+a[4]+a[6] == a[0]+a[3]+a[6] &&
        a[0]+a[3]+a[6] == a[1]+a[4]+a[7] &&
        a[1]+a[4]+a[7] == a[2]+a[5]+a[8]
    )
    return true;
    return false;
}

void input() {
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) {
            scanf("%d", &Map[i][j]);
        }
    }
    int flag = 0;
    do{
        if( check() ) {
            bool f = true;
            for(int i=0; i<3; i++) {
                for(int j=0; j<3; j++) {
                    temp[i][j] = a[i*3+j];
                    if( Map[i][j] && Map[i][j] != temp[i][j] ) {
                        f = false;
                        break;
                    }
                }
                if( !f ) break;
            }
            if( f ) {
                if( flag == 1 ) {
                    flag = 2; break;
                } else flag = 1;
                for(int i=0; i<3; i++) {
                    for(int j=0; j<3; j++) {
                        res[i][j] = temp[i][j];
                    }
                }
            }
        }
        if( flag == 2 ) break;
    }while( next_permutation(a, a+9));
    if( flag == 2 ) printf("Too Many\n");
    else {
        for(int i=0; i<3; i++) {
            for(int j=0; j<3; j++) {
                printf("%d", res[i][j]);
                if( j == 2 ) printf("\n");
                else printf(" ");
            }
        }
    }
    //sysp;
}

 
int main() {
    input();
    return 0;
}
View Code
B HihoCoder 1269 优化延迟

 思路:

  看到题目,第一眼就看到了给出的运行时间10s,果断一发暴力TLE。随后仔细看了下题目,发现当K越大,得出的结果也就越小,这个不是裸二分吗,然后直接上手,wa10+次,最后才发现自己的get_sp竟然是返回int,还以为是自己的二分有问题,改了好几版,-_-||。补充一下,k为什么不能为0呢?虽然为0时相当于没加缓冲。

技术分享图片
// Asimple
#include <bits/stdc++.h>
#define debug(a) cout<<#a<<" = "<<a<<endl
#define sysp system("pause")
using namespace std;
typedef long long ll;
const int maxn = 100000 + 5;
ll T, n, sum, num, m, t, len, ans;
ll a[maxn];

ll get_sp(int cnt) {
    priority_queue<ll> q;
    ll sp = 0, c = 1, v;
    int i = 0;
    while( !q.empty() || i < n ) {
        while( q.size()<cnt && i<n ) q.push(a[i++]);
        v = q.top(); q.pop();
        sp += c*v;
        c ++;
        if( sp > num ) return num + 1;
    }
    return sp;
}

void input() {
    scanf("%lld %lld", &n, &num);
    ll sp = 0; ans = -1;
    for(int i=0; i<n; i++) scanf("%lld", &a[i]);
    ll low = 1, high = maxn;
    while( low <= high ) {
        ll mid = (low+high)/2;
        if( get_sp(mid)<=num ) {
            ans = mid;
            high = mid-1;
        }
        else low = mid+1;
    }
    printf("%lld\n", ans);
    //sysp;
}

 
int main() {
    input();
    return 0;
}
View Code

附上自己wa的截图:

技术分享图片

 

[Offer收割] 编程练习赛1

标签:class   its   onclick   width   targe   debug   offer   queue   put   

原文地址:https://www.cnblogs.com/Asimple/p/9045037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!