【NOIP-普及组-复赛】(2)NOIP2011普及组复赛题解

这只是一个作业,如果有帮到您的,我只能说。。。这不科学。。。
————————————华丽的分割线————————————
第一题:

很有趣的一道题。。。经典做法是字符串读入去头尾0记符号然后乱搞。。。不过我又机智的发明了膜(模)法。。。
下面是代码(主程序巨短)

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i

————————————华丽的分割线————————————
第二题:

[外链图片转存失败(img-QR7fGSXs-1564989707417)(https://img-blog.csdn.net/20160904065250153)]
又是一道恶心死人的字符串题。。。首先我们要把他们全改成小写。。。
推荐语句:

	for(i=0;i='A'&&word[i]<='Z')word[i]+=32;
	for(i=0;i='A'&&sen[i]<='Z')sen[i]+=32;

然后遇到空格就一个字一个字判 把。。。
不过注意判完还要判下一个是不是空格。。
要不然像这个数据:

To
To be or not tobeisaquestion

就狗了
下面是程序

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i='A'&&word[i]<='Z')word[i]+=32;
	for(i=0;i='A'&&sen[i]<='Z')sen[i]+=32;
//	for(i=0;i'z');i++);
	if(pd(i)){ans++;if(first<0)first=i;}
	for(;i

————————————华丽的分割线————————————
第三题:


经典的瑞士轮,这道题一开始第一个思路就是每轮进行操作然后sort一遍
不过要是这样子,数据会让你刚好T掉。。。
所以我们需要常数优化~~~~
怎么优化呢?
首先可以看到每轮操作后每个选手分数要么+1要么不变
于是愉快的使用归并排序
a辣!!!
代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;ib.s);}  
void solve()
{
    int x=1,y=1,z;  
    for (z=1;z<=n*2;z+=2)  
        if (ans[z].w>ans[z+1].w)ans[z].s++,a[x++]=ans[z],b[y++]=ans[z+1];
        else ans[z+1].s++,a[x++]=ans[z+1],b[y++]=ans[z];    
    int i=1,j=1,k=1;  
    while(i

————————————华丽的分割线————————————
第四题:
【NOIP-普及组-复赛】(2)NOIP2011普及组复赛题解_第1张图片
【NOIP-普及组-复赛】(2)NOIP2011普及组复赛题解_第2张图片
这题很。。。恶心。。。
首先本人第一个想法是把算式用加号分开然后遇到括号拆掉继续递归。。。
然后发现没办法算方案数就。。。
第二个方法:dp
听学长讲这是dp?qwq
这道题的正解原来是这样纸的。。。
首先把表达式加_并转后缀
然后dp。。。
首先用一个栈,每遇到一个数就入栈,遇到运算符把栈顶删了dp
状态:f[i][j]表示栈顶为i时答案为j的方案数
另外遇到数入栈时可能会覆盖原来的答案但是没卵用。
状态转移方橙:
遇到+:

f[top-1][1] = (f[top][0] * f[top-1][1] + f[top][1] * f[top-1][0] + f[top][1] * f[top-1][1])%10007;
                    f[top-1][0] = (f[top][0] * f[top-1][0]) % 10007; 

遇到乘相反qwq
就完结了。。。
代码巨长:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  
#define ci const int
#define ri register int
#define ll long long
#define reg register
#define boom return 
#define cmax(a,b) (a)>(b)?(a):(b)
#define cmin(a,b) (a)<(b)?(a):(b)
#define For(i,a,b) for(i=a;i op;
int OPS(char a)
{
    int i;
    for(i=0;i<3;i++)if(a==first[i])return i;
    return -1;
}
inline void Change()
{
    int i;
    char t;
    for(i=0;i=OPS(t))
                            w_c.push_back(op.top()),op.pop();
                        op.push(t);
                    }
                }
            }
            else
            {
                while((!op.empty()) && op.top()!='(')
                    w_c.push_back(op.top()),op.pop();
                op.pop();
            }
        }  
    }    
    while(!op.empty())
        w_c.push_back(op.top()),op.pop();
}
void work()
{
    size_t i,top(0);
    size_t l=w_c.size();
    for(i=0;i

(这个程序是学神写的我只是找了些错误。。。)
————————————华丽的分割线————————————
xiaoyao24256大学神访问量过40^2辣!!!膜膜膜

你可能感兴趣的:(NOIP-普及组-复赛)