题意:
一个人连续n天去买东西,给出n个数据,为之后n天每天要买的东西的数量,如果能按照这个数据购买,则成功,输出“YES",不能按照给定的数据购买,则输出”NO“。店家有两种购买方式,一:一次性购买两个。 二:今天买一个,送一张券留着明天用。(明天手里的券必须用完,如有剩余则失败)。其中两种方式每天都可以购买无数次。
思路:
根据每天要求的购买数量a,肯定是先尽可能用第一种方式购买,这样手里的券ret最少,即之后能成功购买的可能性更高。即对a进行除2取余,如果得到的是1,则将该值赋给a。如果得到的是0,则将2赋给a(防止手里有券没有使用而全使用方法一导致失败)。经过上面的处理,手里的券最多为一张。之后进入循环判断,分为两种大情况,一:有一张券,则对a进行判断,如果a是0,则失败,循环结束。如果a是1,则刚好用券购买,ret置为0。如果是2,则再用方式2购买,ret仍然是1。 二:手里没有券,此时如果a为0或者2,则直接进入下一轮循环。若a为1,则ret置为1.进入下一轮。在循环结束后对ret进行判断。若ret不为0,则购买失败,否则购买成功。
总结:
这一题的审题很重要,比如一二种方式每次可以购买无数次,第二天如果仍有剩余的券没有用完则购买失败。每天要求购买的数量没有确定,不是题目给定的两个例子中的只有0,1,2.
代码:
#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
int main(){
int n;
cin>>n;
int ret=0;
int a;
for(int i=0;i<n;i++){
scanf("%d",&a);
if(a!=0){
a=a%2;
if(a==0) a=2;
}
if(ret==1){ //有券
if(a==2) continue;
if(a==1){
ret=0;
continue;
}
if(a==0) break;
}
if(ret==0){ //没有券
if(a==2) continue;
if(a==1){
ret=1;
continue;
}
if(a==0) continue;
}
}
if(ret==0){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
return 0;
}
2140

被折叠的 条评论
为什么被折叠?



