第四题乍看是个简单的背包问题,其实数据范围很大,但是每个物品的价值1<=p[i]<=10,所以可以按照物品的价值分类物品,酱紫就变成最多M价值,多个物品(能计算),每个物品个数也能计算,每个物品有价值,变成成多重背包,直接套模板,题解略。
第二题二分搞定--
第三题我的想法是高斯消元,但是最后时间没够,而且程序有bug。
补充别人的高斯消元代码,和我思路一致,我的高斯消元模板有bug,以后决定用这个了,代码来自:
#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;
}