列表

详情


NC14410. 学姐肝手游

描述

萌学姐在玩大型手游《futa go》,他现在进入到了战斗环节。
已知战斗环节中,他所支配的“从者“”具有3种攻击卡,分别是“迅捷”,“技巧”和“力量”,即Q卡,A卡,B卡
他手上有3名从者,每个从者都有这3种攻击卡。萌学姐想要他的“从者”们造成最大伤害,他现在手上有5张这3个从者的攻击卡,他可以按顺序选择其中3张卡造成伤害。
伤害的计算有以下规则:
1)    如果只选择了同一个"从者"的3张卡,则会引发“额外攻击”,攻击位置是最后一位。
2)    根据卡不同,造成的伤害分别为:B卡150%,A卡100%,Q卡80%,额外攻击100%。
3)    根据位置(选择顺序)不同,造成的伤害分别为:第一位100%,第二位120%,第三位140%,额外攻击100%。
4)    第一位如果是B卡,则后面所有卡的攻击(包括“额外攻击”)造成的伤害增加50%。
给出5张攻击卡的类型(Q、A、B)和所属从者(1、2、3),计算能造成最大伤害的组合,并输出组合方案,如果存在多个解,输出字典序最小的解

输入描述

输入只有1行。
输入5个字符串,每个字符串包含两个字符,第一个字符是'Q','A','B',代表卡的类型,第二个字符是'1','2','3',代表卡的所属从者。

输出描述

输出一行,包括3个字符串,每个字符串包含两个字符,第一个字符是'Q','A','B',代表卡的类型,第二个字符是'1','2','3',代表卡的所属从者。并且保证该方案是伤害最大的,如果存在多个解,输出字典序最小的解。

示例1

输入:

A2 A3 A1 A1 Q2

输出:

A1 A1 A2

说明:

按顺序选择第1名从者的A卡,第1名从者的A卡,第2名从者的A卡,可以造成最大伤害。

示例2

输入:

A1 A1 Q1 Q2 Q2

输出:

Q1 A1 A1

说明:

按顺序选择第1名从者的Q卡,第1名从者的A卡,第1名从者的A卡,可以造成最大伤害(此组合引发了“额外攻击”)。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 464K, 提交时间: 2022-11-09 19:59:18

#include<bits/stdc++.h>
using namespace std;
const int N=10;
string s[N];
int st[N],a[N];
vector<string>v;
double ans;
double calc()
{
    string res1=s[a[1]];
    string res2=s[a[2]];
    string res3=s[a[3]];

    double sum=0;
    double flag=1;
    if(res1[0]=='B') 
    {
        flag=1.5;
        sum+=1.5;
    }
    else if(res1[0]=='A')    sum+=1.0;
    else    sum+=0.8;
    
    if(res2[0]=='B')    sum+=flag*1.5*1.2;
    else if(res2[0]=='A')    sum+=flag*1.0*1.2;
    else    sum+=flag*0.8*1.2;
    
    if(res3[0]=='B')    sum+=flag*1.5*1.4;
    else if(res3[0]=='A')    sum+=flag*1.0*1.4;
    else    sum+=flag*0.8*1.4;
     
    if(res1[1]==res2[1] && res2[1]==res3[1])
    {
        sum+=flag*1.0;
    }

    return sum;
}
bool check()
{
    string res1;
    string res2; 
    
    for(int i=1;i<=3;i++)    res1+=s[a[i]];
    for(auto x:v)    res2+=x;
    
    return res1<res2;
}
void dfs(int u)
{
    if(u>3)
    {
        double res=calc();
        if(res>ans)
        {
            ans=res;
            v.clear();
            for(int i=1;i<=3;i++)    v.push_back(s[a[i]]);
        }
        else if(res==ans)
        {
            if(check())
            {
                v.clear();
                for(int i=1;i<=3;i++)    v.push_back(s[a[i]]);
            }
        }
        return ;
    }
    
    for(int i=1;i<=5;i++)
    {
        if(!st[i])
        {
            st[i]=1;
            a[u]=i;
            dfs(u+1);
            st[i]=0;
        }
    }
}
signed main()
{
    for(int i=1;i<=5;i++)    cin>>s[i];
    dfs(1);
    
    for(auto x:v)    cout<<x<<" ";
    
    return 0;
}

Java 解法, 执行用时: 34ms, 内存消耗: 10956K, 提交时间: 2022-03-01 15:54:39

import java.util.Arrays;
import java.util.Scanner;

public class Main{
	static String s[]=new String[5];
	static boolean st[]=new boolean[5];
	static String ans="";
	static double sum=0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		
		for(int i=0;i<5;i++) {
			s[i]=cin.next();
		}
		
		Arrays.sort(s);
		
		dfs(0,"");
		
		System.out.println(ans);
	}

	private static void dfs(int n, String sb) {
		// TODO Auto-generated method stub
		if(n==3) {
//			System.out.println(sb);
			double t=f(sb);
			
//			System.out.println(t);
			if(t>sum) {
				sum=t;
				ans=sb;
			}else if(t==sum) {
				if(sb.compareTo(ans)<0) {
					ans=sb;
				}
			}
			
			return;
		}
		
		for(int i=0;i<5;i++) {
			if(!st[i]) {
				st[i]=true;
				if(n>0)dfs(n+1,sb+" "+s[i]);
				else dfs(n+1,sb+s[i]);
				st[i]=false;
			}
		}
		
		
	}

	private static double f(String sb) {
		// TODO Auto-generated method stub
		String ss[]=sb.split(" ");
//		System.out.println(ss[0]);
		double res=1;
		double flag=0;
		if(ss[0].charAt(0)=='B')flag=0.5;
		
		for(int i=0;i<3;i++) {
			double t=check(ss[i].charAt(0))+flag;
			
			if(i==1)t*=1.2;
			if(i==2)t*=1.4;
			res+=t;
		}
		if(ss[0].charAt(1)==ss[1].charAt(1)&&ss[0].charAt(1)==ss[2].charAt(1))res+=check(ss[2].charAt(0));
		
		return res;
	}

	private static double check(char c) {
		// TODO Auto-generated method stub
		if(c=='A')return 1;
		if(c=='B')return 1.5;
		if(c=='Q')return 0.8;
		return 0;
	}

}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 612K, 提交时间: 2020-04-04 22:11:24

#include <iostream>
#include <algorithm>
using namespace std;
string date[5];
double calp(string a){
	if(a[0]=='A'){
		return 1;
	}
	else if(a[0]=='B'){
		return 1.5;
	}
	else if(a[0]=='Q'){
		return 0.8;
	}
}
double cal(string a,string b,string c){
	double ans=0;
	int extra=0;
	int go=0;
	if(a[1]==b[1]&&b[1]==c[1]){
		extra=1;
	}
	if(a[0]=='B') go=1;
	double tmp;
	ans+=calp(a);
	ans+=calp(b)*1.2;
	tmp=calp(c)*1.4;
	ans+=tmp;
	if(extra){
		ans+=tmp;
	}
	if(go){
		ans*=1.5;
	}
	return ans;
	
}

int main()
{
	for(int i=0;i<5;i++){
		cin>>date[i];
	}
	sort(date,date+5);
	double ma=0;
	string ans[3];
	do{
		string a,b,c;
		a=date[0],b=date[1],c=date[2];
		double pos=cal(a,b,c);
		if(pos>ma){
			ans[0]=a;
			ans[1]=b;
			ans[2]=c;
			ma=pos;
		}
	}while(next_permutation(date,date+5));
	for(int i=0;i<3;i++){
		if(i) cout<<" ";
		cout<<ans[i];
	}
	cout<<endl;
	return 0;
}

上一题