NOIP2005提高组题解

(D1T1) 谁拿了最多奖学金 ((OK))

(D1T2) 过河 ((OK))

(D1T3) 篝火晚会 ((OK))

(D1T4) 等价表达式

(T4)又是字符串的大模拟题,果断跳过.

(T1)几个(if)语句来模拟即可.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
const int N=105;
string s[N];
int main(){
	int n,qm,bj,lw;char gb,xb;cin>>n;
	int maxn=0,tot=0,num=0;
	for(int i=1;i<=n;++i){
		cin>>s[i]>>qm>>bj>>gb>>xb>>lw;
		int now=0;
		if(qm>80&&lw>=1)now+=8000;
		if(qm>85&&bj>80)now+=4000;
		if(qm>90)now+=2000;
		if(qm>85&&xb=='Y')now+=1000;
		if(bj>80&&gb=='Y')now+=850;
		if(now>maxn)maxn=now,num=i;
		tot+=now;
	}
	cout<<s[num]<<endl<<maxn<<endl<<tot<<endl;
    return 0;
}

(T2)之前写过,发现只记得结论了,我觉得这道题除去结论很妙之外,细节也超级多.博客

(T3)做了好久好久的模拟+结论题.先把目标序列给模拟出来,然后就是一个结论了,对于目标序列(T)和初始序列(S),(S)要变换到(T)的步数为序列中不同的位数.

然后注意到序列是一个环,所以变换方式有两种,可以向左移也可以向右移.

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    if(ch=='-')o=-1,ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*o;
}
const int N=50005;
int l[N],r[N],a[N],bj[N],L[N],R[N],pos[N],sum1[N],sum2[N];
int main(){
	int n=read(),ans=0;
	for(int i=1;i<=n;++i)l[i]=read(),r[i]=read();
	a[n-1]=1;a[n]=r[1];a[n-2]=l[1];int now=l[1];
	L[1]=l[1];R[1]=r[1];R[l[1]]=1;L[r[1]]=1;
	bj[1]=bj[l[1]]=bj[r[1]]=1;
	for(int i=n-3;i>=2;--i){
		if(l[now]==R[now]&&!bj[r[now]]){
			L[now]=r[now];a[i]=r[now];bj[r[now]]=1;R[r[now]]=now;
			now=r[now];continue;
		}
		if(r[now]==R[now]&&!bj[l[now]]){
			L[now]=l[now];a[i]=l[now];bj[l[now]]=1;R[l[now]]=now;
			now=l[now];continue;
		}
		puts("-1");return 0;
	}
	for(int i=1;i<=n;++i)if(!bj[i]){a[1]=i;break;}
	if(a[2]+a[n]!=l[a[1]]+r[a[1]]){puts("-1");return 0;}
	for(int i=1;i<=n;++i){
        ++sum1[(a[i]-i+n)%n];
        ++sum2[(a[n-i+1]-i+n)%n];
    }
    for(int i=0;i<=n-1;i++)ans=max(ans,max(sum1[i],sum2[i]));
    printf("%d
",n-ans);
    return 0;
}

(T4)咕咕咕.

原文地址:https://www.cnblogs.com/PPXppx/p/11822781.html