求调,急
查看原帖
求调,急
367325
FifthPostulate楼主2022/12/15 12:18

信息学小组轮到我们出题,要出标程,如下:

#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,也刚好花完。


明天就要给老师,急求调

2022/12/15 12:18
加载中...