信息学小组轮到我们出题,要出标程,如下:
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1000005
inline int IntRead()
{
char ch = getchar();
int s = 0, w = 1;
while(ch < '0' || ch > '9')
{
if(ch == '-') w = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9')
{
s = s * 10 + ch - '0',
ch = getchar();
}
return s * w;
}
inline string StringRead()
{
string str;
char s = getchar();
while (s == ' ' || s == '\n' || s == '\r')
{
s = getchar();
}
while (s != ' ' && s != '\n' && s != '\r')
{
str += s;
s = getchar();
}
return str;
}
string str1,str2;
int a[3][MAXN],sum,pain;
int cnt[5][10];
int minn[10];
int dp[1005];
int main () {
str1=StringRead();
str2=StringRead();
sum=IntRead();
sum/=100;
int len1=str1.size(),len2=str2.size();
for(int i=1;i<=len1;i++) {
a[1][i]=str1[i-1]-'0';
}
for(int i=1;i<=len2;i++) {
a[2][i]=str2[i-1]-'0';
}
for(int i=1;i<=len1;i++) {
pain+=a[1][i];
pain+=a[2][i];
}
for(int i=1;i<=len1/2;i++) {
cnt[1][a[1][i]]++;
}
for(int i=len1/2+1;i<=len1;i++) {
cnt[2][a[1][i]]++;
}
for(int i=1;i<=len2/2;i++) {
cnt[3][a[2][i]]++;
}
for(int i=len2/2+1;i<=len2;i++) {
cnt[4][a[2][i]]++;
}
for(int i=0;i<=9;i++) {
minn[i]=min(cnt[1][i],cnt[3][i])+min(cnt[2][i],cnt[4][i]);
}
for(int i=1;i<=9;i++) {
for(int j=1;j<=minn[i];j++) {
for(int k=sum;k>=2*i*j;k--) {
dp[k]=max(dp[k],dp[k-2*i*j]+2*i*j);
}
}
}
printf("%d", pain-dp[sum]);
return 0;
}
这是一个大佬教我的,但测了几个我出的数据感觉不太对,原题目在这里:
题目背景 坎星人是猎户座旋臂中最智慧的物种,但是他们的医术却不甚高超。要命的是,同所有智慧物种一样,他们非常喜欢吃糖和点心。因此很多坎星人被蛀牙终日困扰。
人类的医术十分高超,尤其治牙的方法获得了坎星人的一致认可。你也是一名医生,是专职负责拔牙的,因此,减少病人的疼痛是你的责任。但是坎星人的神经,比地球人敏感非常多倍,因此他们拔牙只可以忍受一秒。
对了,口腔疼痛值可以这么算:所有牙齿疼痛值之和;注意,拔掉的牙就不会再疼
题目描述 但是现在还有一个问题,为了不影响咀嚼和牙齿的对称性,一次拔牙至少要拔四颗,拔过智齿的朋友都知道。但是具体位置并不需要讲究,因为事后还需要矫正。只要将口腔平分为两半,在左右口腔的上下颌随便拔两颗就行了。
每个坎星人会给你一些医药费,收钱的机制是这样的:每颗牙的疼痛值乘以100的和。如果剩余的钱数不够拔剩余的任何四颗牙,你便不会执行这次手术。
拔牙的方案会比较多,但每种方案的要求都是把医药费花到不能花为止。注意,这里的要求并不是说想办法让赚的钱最多,只是说要满足剩下的钱不能执行手术,不用去给钱规划最优解。
综上,你要在已有医药费下规划一个合法方案,使其手术后口腔疼痛值最小
输入格式 两行两个正整数列,长度均为2N,表示上下两排牙齿。
第三行一个数P,表示给出的医药费。
输出格式 一个整数,表示手术后的最小口腔疼痛值。
输入输出样例
输入 #1
110010
010101
400
输出 #1
2
输入 #2
12011021
20212120
600
输出 #2
12
说明/提示
样例#1:
口腔可以分为两半,分别是:
110 010
010 101
左边拔掉两个1,右边也拔掉两个1,刚好花完。
样例#2:
口腔还是可以分为两半,分别是:
1201 1021
2021 2120
左边拔两个2,右边两个1,也刚好花完。
明天就要给老师,急求调