对题意的理解

理解题意真的很重要,很多题的代码并不复杂甚至很简单,但是题面花里胡哨,这时就需要我们从题目中提取出重要信息,不要陷入“乱花渐欲迷人眼”的陷阱

一、“翻译”题面

1、手办——“有理数”

链接:https://ac.nowcoder.com/acm/contest/37344/F
来源:牛客网

题目描述

zsh同学最近喜欢上了原神这个游戏。因为里面有很多卡哇伊的人物。比如 胡桃,刻晴, 都是他喜欢的,于是他买了很多原神的手办,并把它们从1∼n 编号。
现在zsh准备带所有编号为 x 的手办x 为 n的约数并且x的2/3次方为有理数)向zyf炫耀。
问zsh有多少个满足该条件的手办。

题目解释

x的2/3次方为有理数是什么意思: x必为一个整数 i 的三次方,x才能是一个有理数,才可以开出三次方,因此设 :x=i * i * i

x 为 n的约数并且x的2/3次方为有理数 : 则 i * i * i 也是n的约数( i 在1 ~ n之间 )

输入描述:

第一行输入一个 T ,表示有 TT 组测试数据(1e5)
剩下 T 行每行输入一个 n (1e9)

输出描述:

每行输出一个结果数.

示例1
输入

2
4
8

输出

1
2

说明

text 1:编号 1满足条件
text 2:编号1 和编号8满足条件

代码:

#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e9+10;
int n;
int t;

int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		int cnt=0;;
		for(int i=1;i<=1000;i++)
		{
			if(n%(i*i*i)==0)
				cnt++;
		}
		cout<<cnt<<endl;
	}
	return 0;
}

二、易产生歧义的题面

1、“整除”

1、使用for循环输出所有能整除41580的数

注意:是用41580除 i ,不是用 i 除41580

for(int i = 41580; i > 0; i --)
	if(41580%i==0)
		cout<<i<<endl;

三、模拟(将题目描述用代码模拟出来过程)

1、斩龙

链接:https://ac.nowcoder.com/acm/contest/37344/C
来源:牛客网

题目描述

在一个星球上存在两种势力: Dragon,Virm和 Franxx。Franxx
是守护家园的使者;而Dragon,Virm是破坏和平的侵略者(Dragon是Virm的手下)。
为了捍卫和平,Franxx展开了对恶势力的战斗。 该星球存在一个Franxx,一只Virm,和 x
只Dragon,他们都有一个生命值和一个攻击力(所有Dragon的生命值与攻击力相同)。
Franxx会先对Dragon发动攻击,当Dragon剩 k 只时(0 \leq k \leq
x0≤k≤x),Virm会加入战斗。

注:Franxx先发动攻击;Franxx将Dragon击倒完才能攻击Virm;且
Dragon是一只一只上的(被攻击的Dragon才能对Franxx造成伤害)。

输入描述:
第一行两个整数 A1,H1,表示 Franxx的攻击力和生命值;
第二行三个整数 A2,H2,x ,表示 Dragon的攻击力,生命值和个数;
第三行一个整数 k ,如题所述。
第四行两个整数 A3,H3,表示 VirmVirm 的攻击力,生命值;

数据范围:

A1,A2,A3,H1,H2,H3 :1~1e6
x : 1~1e9
0<= k <= x

输出描述:

输出一行。 若能击败邪恶势力,输出“Franxx”的攻击次数。 不能击败邪恶势力,输出“No Franxx!”。(输出不带引号)

示例1
输入

997897 116277
821165 555142 96
45
965679 849599

输出

No Franxx!

示例2
输入

209321 363865
2 68 1000000000
1
9709 8474

输出

1000000001

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
	ll A1,H1,A2,H2,x,k,A3,H3;
    
	cin >> A1 >> H1;//franxx的攻击力和生命值
	cin >> A2 >> H2 >> x;//dragon的攻击力、生命值、个数
	cin >> k;//dragon剩下k只时,virm加入战斗
	cin >> A3 >> H3;//virm的攻击力、生命值
	
	ll cnt = (A1 - 1 + H2 ) / A1;//franxx斩掉一个dragon需要的攻击次数
	
	H1 -= A2 * (cnt - 1) * (x - k);
	if(H1 <=0)
	{
		cout <<"No Franxx!"<<endl;
	//	cout << 1<<endl;
		return 0; 
	}
	
	H1 -= A2 * (cnt - 1) * k;
	H1 -= A3 *(cnt) * k;
	if(H1 <=0)
	{
		cout <<"No Franxx!"<<endl;
	//	cout << 2<<endl;
		return 0; 
	}
	//至此杀了所有的dragon
	
	ll cnt2 = (A1 + H3 - 1)/ A1;
	 H1 -= A3 * (cnt2 - 1);
	 
	if(H1 <=0)
	{
		cout <<"No Franxx!"<<endl;
		return 0; 
	}

	ll res = cnt2 + cnt * x;
	cout << res;

 	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值