1. 程式人生 > >NOIP2016 提高組部分題解

NOIP2016 提高組部分題解

玩具謎題

題目

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<<' ';
    }
}