第四题乍看是个简单的背包问题,其实数据范围很大,但是每个物品的价值1<=p[i]<=10,所以可以按照物品的价值分类物品,酱紫就变成最多M价值,多个物品(能计算),每个物品个数也能计算,每个物品有价值,变成成多重背包,直接套模板,题解略。

第二题二分搞定--

第三题我的想法是高斯消元,但是最后时间没够,而且程序有bug。
补充别人的高斯消元代码,和我思路一致,我的高斯消元模板有bug,以后决定用这个了,代码来自:hihocoder1363 图像算子

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define maxN 105
#define maxn 5000
#define maxm 5000
int h,w,d;
int a[maxN][maxN];
int b[maxN][maxN];

#define eps 1e-9
double Mat[maxn][maxm];
double V[maxn];
void Gasse(int n,int m)
{
    int k=0,i,j;
    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 tem=Mat[k][j] ;
        for(int p=j;p<m;p++) Mat[k][p]/=tem;
        V[k]/=tem;
        
        for(int p=0;p<n;p++){
            if(p!=k&&(fabs(Mat[p][j])>eps)){
                tem=Mat[p][j];
                for(int q=0;q<m;q++)Mat[p][q]-=tem*Mat[k][q];
                V[p]-=tem*V[k];
            }
        }
        k++;
    }
}

int main()
{
    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");
    }
}

第一题太水,直接上代码:

/**
        Author: SpringHack - springhack@live.cn
        Last modified: 2016-08-21 12:02:27
        Filename: main.cpp
        Description: Created by SpringHack using vim automatically.
**/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;



int main()
{
    int w[26];
    char ret[25], str[300];
    for (int i=0;i<26;++i)
        w[i] = 1; 
    cin >> str;
    int p = 0;
    for (int i=0;i<strlen(str);++i)
    {
        if (w[str[i] - 'A'] == 0 || str[i] == 'J')
        {
            //NNN
        } else {
            ret[p++] = str[i];
            w[str[i] - 'A'] = 0;
        }
    }
    for (int i=0;i<26;++i)
    {
        if (w[i] == 1 && (i + 'A') != 'J')
            ret[p++] = (i + 'A');
    }
    for (int i=0;i<5;++i)
    {
        for (int j=0;j<5;++j)
            cout << ret[i*5+j];
        cout << endl;
    }
    return 0;
}