整体
大致以做题为主
建议由易到难,基础的东西先做,技巧性的后做,最大化效率
注意看之前的总结
沉下去,会精彩
具体
模拟
luoguP3952 时间复杂度
信了樊某某的鬼,挑战这一神题简单题目
其实还挺好玩的....我觉得打for总错的同学做这题会简单一点...
我实在不想写解析了(估计也没人看)(代码也丑....
就写写自己的收获吧:(我基础差,勿喷
- string 类型的变量a,b ,在size相等的情况下可以直接用
<``=>
等判大小,size不等时,根据size, 返回大小关系 - char 类变量虽然能够赋初值为'15'这个样的两位,但是在输入的时候还是只能读单个字符
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
int t, n, tot;
string o, st, ed;
char tmp, x, is[30];
int fcnt, ecnt, tag;//tag判断for循环是否进行的下去
int t_f, zhishu, tmp_zhishu, lazy_zhishu;
//t_f: true or false判断语句是否合法,tmp_zhishu保存每大组for之后的指数 ,lazy_zhishu:保存每大组中小组完结的数
void pre() {
tot = tag = lazy_zhishu = tmp_zhishu = zhishu = fcnt = ecnt = t_f = 0;
for(int i = 1; i < 30; ++i) is[i] = 0;
}
int find(char x) {//优化? 直接找吧
for(int i = 1; i < tot; ++i) if(is[i] == x) return 1;
return 0;
}
int smaller(string st, string ed) {
if(st[0] != 'n'){
if(ed[0] == 'n') return 1;
else if(ed.size()>st.size() || (ed.size()==st.size() && ed>st)) return 0;//注意string
return -1;//返回-1: 并不能进入for,所以不能更新tmp_zhishu
} else {
if(ed[0] == 'n') return 0;
return -1;
}
}
void print_ans() {
if(t_f) {
printf("ERR\n");//注意坑人大小写
return ;
}
if(zhishu==0){
if(o[2]=='1') printf("Yes\n");
else printf("No\n");
} else {
if(zhishu<10 && o[4]-'0'==zhishu) printf("Yes\n");
else if(zhishu<100 && (o[4]-'0')*10+(o[5]-'0')==zhishu) printf("Yes\n");
else if(zhishu<1000 && (o[4]-'0')*100+(o[5]-'0')*10+(o[6]-'0')==zhishu) printf("Yes\n");
else printf("No\n");
}
}
int main() {
scanf("%d",&t);
while(t--) {
pre();
scanf("%d",&n);
cin>>o;
for(int i = 1; i <= n; ++i) {
cin>>tmp;
if(tmp=='F') {
fcnt += 1;
cin>>x>>st>>ed;
if(find(x) == 1) t_f = 1;
else is[++tot] = x;
int fhz = smaller(st, ed);
// printf("fhz: %d\n",fhz);
if(fhz == 1 && tag==0 && lazy_zhishu==0) ++tmp_zhishu;
else if(fhz == -1) ++tag;
if(lazy_zhishu) lazy_zhishu -= 1;//放后面
}
else if(tmp=='E') {
ecnt += 1;
tot -= 1;//一个for完了,它这个参数就可用了
if(tag) tag -= 1;
lazy_zhishu += 1;
if(ecnt == fcnt) zhishu = max(zhishu, tmp_zhishu), tmp_zhishu = 0,lazy_zhishu = 0/*,printf(" %d\n", zhishu)*/;
if(ecnt > fcnt) t_f = 1;
//计算每份的zhishu,并为重开的一大组for赋lazy-zhishu
}
}
if(ecnt != fcnt) t_f = 1;
print_ans();
}
return 0;
}