[Offer收割]编程练习赛4

原创 2016年08月31日 17:07:58

Playfair密码表

题目链接:

http://hihocoder.com/problemset/problem/1361

解题思路:

模拟即可。

AC代码:

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

const int N = 30;
int vis[N];
char output[N];

int main(){
    string str;
    while(cin>>str){
        memset(vis,0,sizeof(vis));
        int len = str.size();
        for(int i = 0; i < len; ++i){
            if(str[i] == 'J')
                str[i] = 'I';
        }
        int l = 0;
        for(int i = 0; i < len; ++i){
            if(!vis[str[i]-'A'])
                output[l++] = str[i];
            vis[str[i]-'A'] = 1;
        }
        for(int i = 0; i < 26; ++i){
            if(!vis[i] && i != 9)
                output[l++] = 'A'+i;
        }
        for(int i = 0; i < 25; ++i){
            printf("%c",output[i]);
            if(i%5 == 4)
                puts("");
        }
    }
    return 0;
}

修补木桶(二分)

题目链接:

http://hihocoder.com/problemset/problem/1362

解题思路:

二分答案,枚举起点。

AC代码:

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

const int N = 1005;
int n,m,L;
int a[N];

int solve(int x){
    int num = 0;
    for(int i = 0; i < n; ++i){
        if(a[i] < x){
            ++num;
            i += L-1;
        }
    }
    return num;
}

int main(){
    while(~scanf("%d%d%d",&n,&m,&L)){
        for(int i = 0; i < n; ++i)
            scanf("%d",&a[i]);
        int l = 0,r = 1e9+7;
        while(l <= r){
            int mid = (l+r)/2;
            int num = 10000;
            for(int i = 0; i < L; ++i){
                for(int j = 0; j < n-1; ++j)
                    swap(a[j],a[j+1]);
                num = min(num,solve(mid));
            }
            if(num <= m) l = mid+1;
            else r = mid-1;
        }
        printf("%d\n",r);
    }
    return 0;
}

图像算子(高斯消元)

题目链接:

http://hihocoder.com/problemset/problem/1363

解题思路:

解线性方程组,高斯消元。

AC代码:

#include<bits/stdc++.h>
#define eps 1e-9
using namespace std;

const int N = 105;
const int M = 10005;
int h,w,d;
int a[N][N];
int b[N][N];
double Mat[M][M];
double V[M];

void Gasse(int n,int m){
    int i,j,k = 0;
    for(j = 0; j < m; ++j){
        for(i = k; i < n; ++i){
            if(fabs(Mat[i][j]) > eps)
                break;
        }
        if(i == n)
            continue;

        for(int p = 0; p < m; ++p)
            swap(Mat[i][p],Mat[k][p]);
        swap(V[i],V[k]);

        double tmp = Mat[k][j] ;
        for(int p = j; p < m; ++p)
            Mat[k][p] /= tmp;
        V[k] /= tmp;

        for(int p = 0; p < n; ++p){
            if(p!=k && (fabs(Mat[p][j])>eps)){
                tmp = Mat[p][j];
                for(int q = 0; q < m; ++q)
                    Mat[p][q] -= tmp*Mat[k][q];
                V[p] -= tmp*V[k];
            }
        }
        ++k;
    }
}

int main(){
    while(~scanf("%d%d%d",&h,&w,&d)){
        for(int i = 0; i < h; ++i){
            for(int j = 0; j < w; ++j){
                scanf("%d",&a[i][j]);
                }
        }
        for(int i = 0; i < h-d+1; ++i){
            for(int j = 0; j < w-d+1; ++j){
                scanf("%d",&b[i][j]);
            }
        }
        int r = 0;
        for(int i = 0; i < h-d+1; ++i){
            for(int j = 0; j < w-d+1; ++j){
                for(int p = 0; p < d; ++p){
                    for(int q = 0; q < d; ++q){
                        Mat[r][p*d+q] = a[i+p][j+q];
                    }
                }
                V[r] = b[i][j];
                r++;
            }
        }
        Gasse(r,d*d);
        for(int i = 0; i < d*d; ++i){
            if(i%d != 0)
                printf(" ");
            if(V[i] > -1e-6)\
                printf("%.0f",(V[i]+1e-6));
            else
                printf("%.0f",(V[i]-1e-6));
            if(i%d == d-1)
                printf("\n");
        }
    }
    return 0;
}

奖券兑换(多重背包)

题目链接:

http://hihocoder.com/problemset/problem/1364

解题思路:

二进制优化背包

AC代码:

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

const int N = 100005;
map<pair<int,int>,int> mp;
int dp[N];

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)){
        int need,value;
        for(int i = 1; i <= n; ++i) {
            scanf("%d%d",&need,&value);
            ++mp[make_pair(need,value)];
        }
        vector<pair<pair<int,int>,int> > v(mp.begin(),mp.end());
        for(int i = 0; i < (int)v.size(); ++i){
            int num = v[i].second;
            need = v[i].first.first;
            value = v[i].first.second;
            for(int k = 1; num > 0; k <<= 1) {
                int mul = min(k,num);
                for(int j = m; mul * need <= j; --j) {
                    dp[j] = max(dp[j],dp[j-mul*need] + mul*value);
                }
                num -= mul;
            }
        }
        int ans = *max_element(dp, dp+m+1);
        printf("%d\n", ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

[Offer收割]编程练习赛4

满减优惠 题目链接: http://hihocoder.com/problemset/problem/1353 解题思路: 题目大意: 从数组中选出若干个数,使得这些数的和大于X,并且尽可能的小。 ...
  • piaocoder
  • piaocoder
  • 2016年08月31日 15:13
  • 300

[Offer收割]编程练习赛4

[Offer收割]编程练习赛4  题目简单描述和思路简析 最近天气炎热,小Ho天天宅在家里叫外卖。他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元。并且如果消费总计满...
  • chen8766250
  • chen8766250
  • 2016年08月09日 16:09
  • 475

[Offer收割]编程练习赛4及参考

[Offer收割]编程练习赛4及参考
  • u010913001
  • u010913001
  • 2016年08月18日 13:57
  • 340

[Offer收割]编程练习赛7

图片排版 题目链接: http://hihocoder.com/problemset/problem/1365 解题思路: 比较容易想到是O(n^2)的解决方案,遍历n种删除可能,每次遍历O(...
  • piaocoder
  • piaocoder
  • 2016年08月31日 15:59
  • 587

[Offer收割]编程练习赛8

1473 : 小Ho的强迫症题解在mod L的情况下每次加D,最终相邻点的距离一定为__gcd(L,D),然后只需要判断是否大于脚长F即可#include #include #include #...
  • hzh_0000
  • hzh_0000
  • 2017年03月05日 17:24
  • 167

[Offer收割] 编程练习赛3

hiho密码 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho根据最近在密码学课上学习到的知识,开发出了一款hiho密码,这款密码的秘钥是这...
  • piaocoder
  • piaocoder
  • 2016年03月27日 20:43
  • 301

[Offer收割]编程练习赛33

矩阵游戏II 题解 由于是整列整列的处理的,所以相当于处理一个数组,然后取相反数,排个序处理就可以了 代码 #include #include #include #include #i...
  • qq_18661257
  • qq_18661257
  • 2017年11月01日 16:01
  • 121

[Offer收割]编程练习赛10

题目1 : 出勤记录I略。题目2 : 出勤记录II题解:dp【i】【0】表示最后一个是O的前i个可能的种类数 dp【i】【1】表示最后一个是L并且连续1次的前i个可能的种类数 dp【i】【2】表示...
  • hzh_0000
  • hzh_0000
  • 2017年03月19日 15:27
  • 178

[Offer收割]编程练习赛29

逃离迷宫4 题解 题目求解(a,b)(a,b)出口,反向思维,由(a,b)(a,b)往(x,y)(x,y)推导,发现仅有一条可行路径,如果不存在就输出−1-1即可 代码 #include #...
  • qq_18661257
  • qq_18661257
  • 2017年10月26日 14:04
  • 87

[Offer收割]编程练习赛1

做了三题,题目都比较暴力。 A题 题目链接:A题 题意:给你一个三阶的幻方,三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的...
  • u014325920
  • u014325920
  • 2016年03月06日 19:04
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Offer收割]编程练习赛4
举报原因:
原因补充:

(最多只允许输入30个字)