NOIP2016 提高组部分题解

版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84960554

玩具谜题

题目

https://www.luogu.org/problemnew/show/P1563

代码

#include<bits/stdc++.h>
using namespace std;
int n,order;//命令
struct toy
{
	bool Ori;//朝向Orientation
	char Pro[100];//职业Profession
}o[100100];
int ai,si;//若ai=0,表示向左数Si个人;若ai=1,表示向右数Si个人。
int now=0;
void add (int x)
{
	now+=x;
	if (now!=0) now=(now%n+n)%n;
}
int main()
{
	cin>>n>>order;
	for (int i=0; i<n; i++)
		cin>>o[i].Ori>>o[i].Pro;
	for (int i=0; i<order; i++)
	{
		cin>>ai>>si;
		if (ai^o[now].Ori) add(si);
		else add(-si);
	}
	cout<<o[now].Pro;
	return 0;
}

组合数问题

题目

https://www.luogu.org/problemnew/show/P2822

代码

#include<bits/stdc++.h>
using namespace std;
int c[2222][2222],sum[2222][2222],t,k,n,m,i,j;
int main()
{
	cin>>t>>k;
	for(i=0;i<=2000;i++)	c[i][0]=c[i][i]=1;
	for(i=1;i<=2000;i++)
		for(j=1;j<=2000;j++)
			c[i][j]=(c[i-1][j-1]+c[i-1][j])%k;
	for(i=1;i<=2000;i++)
		for(int j=1;j<=2000;j++)
		{
			sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
			if(!c[i][j]&&i>=j)
				sum[i][j]++;
		}
	for(int i=1;i<=t;i++)
	{
		cin>>n>>m;
		cout<<sum[n][m]<<endl;
	}
	return 0;
}

蚯蚓

题目

https://www.luogu.org/problemnew/show/P2827

代码

#include<bits/stdc++.h>
using namespace std;
int read(){int a;cin>>a;return a;}
int i,t;
int n,m,q,T,now,e1,e2,e3;
double u,v;
struct aba:queue<int>{
};
int operator + (const aba &a,const aba &t)
{
    if(a.empty())
        return -10000;
    return a.front()+q*(i-t.front());
}
aba a1,a2,a3,t1,t2,t3,ans;
inline int maxx()
{
    e1=a1+t1;e2=a2+t2;e3=a3+t3;
    if(e1>=e2&&e1>=e3)
    {
        a1.pop();t1.pop();
        return e1;
    }
    if(e2>=e1&&e2>=e3)
    {
        a2.pop();
        t2.pop();
        return e2;
    }
    a3.pop();t3.pop();
    return e3;
}
int o[100010];
inline bool Orz(int a,int b)
{
    return a>b;
}
int main()
{
    n=read(),m=read(),q=read(),u=read(),v=read(),T=read();
    for(i=1;i<=n;i++)
        o[i]=read();
    sort(o+1,o+1+n,Orz);
    for(i=1;i<=n;i++)
    {
        a1.push(o[i]);
        t1.push(1);
    }
    for(i=1;i<=m;i++)
    {
        now=maxx();
        if(i%T==0)
            cout<<now<<' ';
        a2.push(int(now*u/v)-q);
        t2.push(i);
        a3.push(now-int(now*u/v)-q);
        t3.push(i);
    }
    cout<<endl;
    i=m+1;
    for(n=1;!a1.empty()|| !a2.empty()|| !a3.empty();n++){
        now=maxx();
        if(n%T==0)
            cout<<now<<' ';
    }
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84960554