NOIP2017
评价:质量还不错的一年,难度适中,没有16年的毒瘤,也没有18年的日怪。
T1
解答
神仙结论题,其实考试的时候打表也可以找出规律。注意开long long
结论是 a × b − a − b a\times b-a-b a×b−a−b
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long i,j,k;
cin>>i>>j;
k=i*j-i-j;
cout<<k;
return 0;
}
T2
算是一道适中的模拟题吧,注意一下细节就行。
我代码写的丑
// luogu-judger-enable-o2
#include <cstring>
#include <iostream>
#include <stack>
#include <fstream>
#include <queue>
#include <string>
#include <sstream>
#include <set>
using namespace std;
struct F{
char var;
int x,y;
};
struct E{
int tag;//没啥用,就是标记一个结束而已
};
int p;
bool O1=false;
const int ERR = 0x9897;
const int YES = 0x7467;
const int NO = 0x545a;
inline int to_int(string s,int b,int e){
int x = 0,f = 1;;
int i = b;
if(s[i]=='-')f = -1,i=-~i;
for(;i<=e;i=-~i){
x = (x<<3)+(x<<1)+s[i]-'0';
}
return x*f;
}
int check(queue<string> q){
bool vars[27];//是否在栈里面
memset(vars,false,sizeof(vars));
stack<char>var_stack;//变量栈
stack<F> f_stack;//用于储存f语句的栈
int depth = 0;//如果有不执行的循环,那么嵌套的深度
bool deadloop = false;//是否有不执行的循环
int act_p = 0;
int num = 0;//常数复杂度
int pow = 0;//指数复杂度
while(!q.empty()){
string top = q.front();
q.pop();
string temp;
if(top[0]=='F'){
//F语句
F f;
temp = q.front();
q.pop();
if(vars[temp[0]-'a']){
return ERR;
}else{
vars[temp[0]-'a'] = true;
var_stack.push(temp[0]);
f.var = temp[0];
}
int x,y;
temp = q.front();
q.pop();
if(temp[0]=='n')x=999;else x = to_int(temp,0,temp.size()-1);
temp = q.front();
q.pop();
if(temp[0]=='n')y = 999;else y = to_int(temp,0,temp.size()-1);//x,y分别看看是不是n,如果是的话就执行
if(x>y){
deadloop = true;
depth++;
}else{
depth++;
if(deadloop){
//do nothing
}else{
if(x<=100&&y>=999){
pow++;
}else{
num++;
}
}
}
f.x = x,f.y = y;
f_stack.push(f);
}else{
act_p = max(act_p,pow);
if(f_stack.empty()){
return ERR;
}
depth--;
if(depth == 0){
deadloop = false;
pow=0;
}
F t = f_stack.top();
f_stack.pop();
vars[t.var-'a'] = false;
var_stack.pop();
if(t.x<=100