理解题意真的很重要,很多题的代码并不复杂甚至很简单,但是题面花里胡哨,这时就需要我们从题目中提取出重要信息,不要陷入“乱花渐欲迷人眼”的陷阱
一、“翻译”题面
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;
}