(D1T2) 过河 ((OK))
(D1T3) 篝火晚会 ((OK))
(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)咕咕咕.