NOIP2011普及组


T2  统计单词数

 也是一道经典题

字符串匹配

#include
#include
#include
#include
#include
using namespace std;
string a;
string jus;
int main(){
	getline(cin,a);
	getline(cin,jus);
	//含有空格的字符串输入
	int lenw=a.length();
	int lena=jus.length();
	for(int i=0;i='a'&&a[i]<='z') a[i]-=32;
	}
	for(int j=0;j='a'&&jus[j]<='z') jus[j]-=32;	
		}
	int sum=0,pos=-1;
	for(int i=0;i<=lena-lenw;i++){ //注意上限 
	int j;   //呜呜呜呜要自闭了这个要写在外面,因为j在后面判断 
		for(j=0;j0&&jus[i-1]!=' ') break; //如果不是单词开头就结束
		}
			if(j==lenw&&(jus[i+j]==' '||i+j==lena)) {  //!!!!!
				sum++;
				if(sum==1) pos=i ;
			} 
		} 
	if(sum==0) cout<<"-1"<


T3  瑞士轮

 归并排序的思想,(没想到吧)这些事基础要掌握的东西啊!!!
每打完一轮后,都要通过归并排序的思想再次确定一个顺序表(2*N)的,然后在顺序表中确定这一次的输赢结果,分别放在win,lose里面,然后再放在顺序表中

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=200002;
const int INF=0x3fffffff;
//这道题用了归并排序的思想,排两个有序表,这两个有序表就是处理之后的输赢表 
//处理好输赢表(根据能力)之后,需要再次排序(根据分数),也就是设置两个下标i,j,这样就是归并排序的思想,直接用sort的话会超时 
struct node{
	int fen; //分数 
	int rank;   
	int power;  //能力 
};
node win[maxn],lose[maxn],d[maxn];
int n,r,q;
bool cmp(node a,node b){
	if(a.fen!=b.fen) return a.fen>b.fen;
	else return a.ranklose[j].rank)){
				index++;
				d[index]=lose[j];
				j++;
			}
			else{
				index++;
				d[index]=win[i];
				i++;
			}
		}
	}
}

int main(){
	scanf("%d %d %d",&n,&r,&q);
	n*=2;
	for(int i=0;it2){
				win[t3]=d[i];
				lose[t3]=d[i+1];
				win[t3].fen++;
			}
			else{
				win[t3]=d[i+1];
				lose[t3]=d[i];
				win[t3].fen++;
			}
		}
		guibing();
		
	//	cout<


T4  表达式的值

是一道没有头绪的题目

通过保存计算结果(上一步的)

首先这道题目,我们要先搞清楚我们如何从前往后退出答案。可以肯定的是,在出现某个特定符号的时候,我们要知道如何从已知答案中推出之后的答案。这其实就是一个用公式递推的过程。每一步计算下一步答案为0或1的方法数:设两个步骤的运算结果经过每个符号到一个结果时,第一个运算结果算出0的方案数为t1,1的方案数为t2。第二个算出0的方案数为t3,算出1的方案数为t4,则有: 当符号是“⊕”时,得到0的方案数为t1*t3,1的方案数:t1*t4+t2*t3+t2*t4 当符号是“×”时,得到0的方案数为t1*t3+t1*t4+t2*t3,1的方案数:t2*t4 用一个栈记录下来即可。

然后按以下方法计算:

  1. 如果是左括号,就直接进栈;
  2. 如果是右括号,就一直弹栈并加以计算,直到弹到左括号;
  3. 如果是运算符,则弹栈,直到这个运算符的优先级大于符号栈栈顶的符号的优先级 或是左括号或栈空,然后将运算符进栈; 最后再将栈中残余的符号和结果一直弹到只剩一个结果,这个就是最后的结果。
#include 
const int M=10007,N=100005;
int n, u[N], v[N], top, k;
char c[N], S[N], ans[2*N];
int main()
{
    scanf("%d",&n);
    scanf("%s",c);
    ans[++k]='.';
    for(int i = 0; c[i]; i++)
    {
        if(c[i] == '(' || c[i] == '*')
            S[++top] = c[i];
        if(c[i] == '+')
        {
            while(S[top] == '*')
                ans[++k] = S[top--];
            S[++top] = c[i];
        }
        if(c[i] == ')')
        {
            while(S[top] != '(')
                ans[++k] = S[top--];
            top--;
        }
        if(c[i] != '(' && c[i] != ')')
            ans[++k]='.';
    }
    while(top > 0)
        ans[++k] = S[top--];
    for(int i = 1; i <= k; i++)
    {
        if(ans[i] == '.')
        {
            u[++top] = 1;
            v[top] = 1;
        }
        if(ans[i] == '*')
        {
            top--;
            u[top] = (u[top+1]*v[top]+u[top]*v[top+1]+u[top]*u[top+1])%M;
            v[top] = v[top]*v[top+1]%M;
        }
        if(ans[i] == '+')
        {
            top--;
            v[top] = (u[top+1]*v[top]+u[top]*v[top+1]+v[top]*v[top+1])%M;
            u[top] = u[top]*u[top+1]%M;
        }
    }
    printf("%d",u[1]);
    return 0;
}