【NOIP专题】NOIP2017

NOIP2017竞赛质量评价良好,难度适中。涵盖T1至T6六道题目,包括神仙结论、模拟、记忆化搜索、并查集、旅行商问题的DP解法和线段树应用。详细解答涉及各种算法和技巧。
摘要由CSDN通过智能技术生成

NOIP2017

评价:质量还不错的一年,难度适中,没有16年的毒瘤,也没有18年的日怪。

T1

题面

解答

神仙结论题,其实考试的时候打表也可以找出规律。注意开long long
结论是 a × b − a − b a\times b-a-b a×bab

#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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值