[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;
}


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

相关文章推荐

鱼还是熊掌:浅谈多进程多线程的选择

关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,那就没有这么简单了,选的不好,会让你深...

2015年度总结

前言: 其实本不想写这个总结(2015年度总结),因为回忆往事难免会有所伤感,而且自己的文笔也不是很好(不喜勿喷),所以迟迟未动笔写。但是这几日想了想,1.为大四做个铺垫,想更好的努力学习;2.为了...

LeetCode Database(175-180)

175. Combine Two Tables select FirstName,LastName,City,State from Person left join Address on Person...

HDU 5017 Ellipsoid(模拟退火算法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5017

二级域名的实现

直接在httpd.conf里添加 #文件路径 DocumentRoot "/var/www/html/blog" ServerName blog.piaocoder...

退役贴

退役帖 不得不承认自己终究还是要退役啦,好心塞,作为弱校,难得有机会去参见现场赛,可是还是被虐成狗啦,归根结底,还是自己 不够强,没有作为表率,给学校带来首牌。 其实省赛结束后,就意识到自己离退役不远...

西峰辦证13724130008QQ347830610

(网上办证)制作咨询公司 (网上办证)制作咨询公司专刻各种公章,原子印等,并制作或代办全球各种证件(优惠咨询13724130008QQ347830610)1、全日制毕业证书、国外文凭.自学考试、成人教...

又是曾经

曾经以为我们会永远,      曾经以为我们会一起走下去,      曾经以为我们会幸福,      曾经以为你是我的唯一,  &...

WinCE6.0中实现SilverLight for Embedded界面中的框架效果

这段时间在考虑如何在SilverLight for Embedded(SE)中实现向网页的框架那样的效果,有若干个独立的XAML来组成一个页面。奋斗了好多天,网上实在是无法找到代码,搜啊搜,最终无意中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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