CF105

吐槽:好长的题目啊啊啊啊啊
我这套题选的不够好,基本上就把时间浪费在理解题意上了。

A.Transmigration

CF原题链接

题目大意:

给定n个能力的名称与能力值,在下一轮这些能力值会乘一个系数k(向下取整),若能力值在下一轮小于100,会失去这个能力。此外,在下一轮会重新拥有m个能力,这些能力的能力值默认为0。求第二轮拥有能力的数量,以及所有能力名称与它的能力值(按字典序输出)。(1n,m20,0.01k0.99)

解题思路:

map直接搞定。但在浮点数转整数的时候要注意精度问题(double怒挂不知道多少分)

代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=25;
double n,m;
double k;
map <string,float> mp;
int cnt;

signed main()
{
	cin>>n>>m>>k;
	for (int i=1;i<=n;i++)
	{
		string str;
		int x;
		cin>>str>>x;
		mp[str]=x*k;
		if (mp[str]<100) {mp[str]=-1;cnt--;}
		cnt++;
	}
	for (int i=1;i<=m;i++)
	{
		string str;
		cin>>str;
		if (mp[str]>0) continue;
		mp[str]=0;
		cnt++;
	}
	cout<<cnt<<endl;
	map <string,float> ::iterator it=mp.begin();
	for (;it!=mp.end();it++)
	{
		if ((int)(it->second)==-1) continue;
		else cout<<it->first<<" "<<(int)(it->second)<<endl;
	}
	return 0;
}

B.Dark Assembly

CF原题链接

题目大意:

共有n个人,每个人分别有两个属性:bi,li。对于第i个人,他投出赞成票的概率为li100

共有k次机会给任意人的 li10。若投出赞成票的人数严格过半,那么此次投票成功;若人数不过半,那么有AA+B的概率可以使此次投票成功。其中B表示对于所有未投出赞成票的人iB=Σbi

求在k次改变li方案最优的情况下,最后投票成功的概率。(1n,k8,1A9999)

解题思路:

第一眼:好难好难

第二眼:这个数据范围?搜索启动!

因为1n8,所以我们大可以直接dfs枚举所有情况。先dfs一遍,枚举k次改变 li 的情况,对于每种情况,再dfs求出概率,最后取概率最大值即可。

代码
#incIude <bits/stdc++.h>
#define int long long
using namespace std;
const int N=10;
int n,k;
long double A;
int b[N],l[N];
long double ans,anss; 

void calc(int cnt1,int cnt2,long double dt,long double B)
{
	if (cnt1>n)//个数
	{
		if (cnt2>n/2) ans+=1.0*dt;//投票成功
		else ans+=1.0*dt*(A/(A+B));//投票失败
		return ;
	}
	calc(cnt1+1,cnt2+1,1.0*dt*l[cnt1]/10,B);//该次投赞成票
	calc(cnt1+1,cnt2,1.0*dt*(100-l[cnt1])/10,B+b[cnt1]);//该次不投赞成票
}
void dfs(int m,int cnt)
{
	if (m>k)//k次机会已用完
	{
		ans=0;
		calc(1,0,1,0);
		anss=max(anss,ans/pow(10,n));
		return ;
	}
	for (int i=cnt;i<=n;i++)
	{
		if (l[i]==100) continue;
		l[i]+=10;
		dfs(m+1,i);
		l[i]-=10;
	}
}
signed main()
{
	cin>>n>>k>>A;
	for (int i=1;i<=n;i++) cin>>b[i]>>l[i];
	dfs(1,0);
	cout<<fixed<<setprecision(10)<<anss;
	return 0;
}

C.Item World

CF原题链接

题目大意:

难以翻译。

题目给出 n(3n100) 个武器的名称name,种类class,攻击值atk,防御值def,法力值res,容量size;给出 k(1k1000) 个强化装备的名称name,种类type,数值bonus,原来位置home

n个武器,分别有攻击、防御、法力三种种类class,所有武器都有相应的攻击atk、防御def、法力值res。每个武器有相应的容量size,表示该武器上最多放size个强化装备。有k种强化装备,每个强化装备可以对相应种类type武器的相应值增加bonus。强化装备必须都放在武器上。

要求给出一种方案,使得移动强化装备后,有最高攻击力的攻击武器;若攻击力相同,要求有最高防御力的防御武器;若防御武器相同,要求有最高法力值的法器。输出该方案三种武器的名称、强化装备数量与强化装备名称。

解题思路:

贪心模拟,直接做做完了


posted @   还是沄沄沄  阅读(140)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示