2020年“美团杯”程序设计挑战赛 部分题解

http://uoj.ac/contest/53/standings

签了一个A,然后就就结束了。全靠队友,又会玩魔塔,又会matlab又会猜原根。。。。

A查查查乐乐

div2 C题难度的DP,去年银川网络赛第二场抄的很久以前的cf的原题

#include
using namespace std;
typedef long long ll;

const int maxl=210+10;

int n,cas,ans;
int dp[maxl][6];
char s[maxl],a[6]; 

inline void prework()
{
	scanf("%s",s+1);
	n=strlen(s+1);
	a[1]=a[2]=a[3]='x';
	a[4]=a[5]='l';
}

inline void mainwork()
{
	for(int i=0;i<=n;i++)
		for(int j=0;j<=5;j++)
			dp[i][j]=101;
	dp[0][0]=0;
	for(int i=1;i<=n;i++)
	if(s[i]=='x')
	{
		dp[i][0]=dp[i-1][0]+1;
		dp[i][1]=min(dp[i-1][0],dp[i-1][1]+1);
		dp[i][2]=min(dp[i-1][1],dp[i-1][2]+1);
		dp[i][3]=min(dp[i-1][2],dp[i-1][3]);
		dp[i][4]=dp[i-1][4];
	}
	else
	{
		dp[i][0]=dp[i-1][0];
		dp[i][1]=dp[i-1][1];
		dp[i][2]=dp[i-1][2];
		dp[i][3]=dp[i-1][3]+1;
		dp[i][4]=min(dp[i-1][3],dp[i-1][4]+1);
	}
	ans=101;
	for(int i=0;i<=4;i++)
		ans=min(dp[n][i],ans);
}

inline void print()
{
	printf("%d\n",ans);
}

int main()
{
	int t;
	scanf("%d",&t);
	for(cas=1;cas<=t;cas++)
	{
		prework();
		mainwork();
		print();
	}
	return 0;
}

 

 

B图片解密

数学院的队友会用matlab,然而我啥可视化都不会。。。

set1直接10不同色缩小就好了

set2

通过新加坡那个钟,2020年“美团杯”程序设计挑战赛 部分题解_第1张图片

发现86400=24*60*60,然后就只要看时针和分针组成的图案就行了

2020年“美团杯”程序设计挑战赛 部分题解_第2张图片

 

 

C魔塔

队友玩出来了。。我玩了一个小时没玩出来。。。一开始发现第一个问号钥匙颜色总是一样的,以为问号颜色不变。。。标了张表格后发现有一些问号颜色会变。。。吐了

 

 

E半前缀计数

队友说“这题区域赛金牌起步的sam,然而在这里被当签到题20分钟就被人切了”

#include
using namespace std;
const int N=2e6+10;
int T[N][30],fa[N],len[N],cnt,last,pos[N];
void build(int v){
    int i,p=last,np,q,nq;
    last=np=++cnt;
    len[np]=len[p]+1;
    for(;p&&T[p][v]==0;p=fa[p]) T[p][v]=np;
    if(p==0) fa[np]=1;
    else{
        q=T[p][v];
        if(len[q]==len[p]+1) fa[np]=q;
        else{
            nq=++cnt;
            len[nq]=len[p]+1;
            fa[nq]=fa[q];
            fa[q]=fa[np]=nq;
            for(i=0;i<27;i++) T[nq][i]=T[q][i];
            for(;T[p][v]==q;p=fa[p]) T[p][v]=nq;
        }
    }
}

char s[1000010];
long long sum[1000010][30];
vectorg[N];
void dfs(int u,int f){
     int i,v;
     for(i=0;i

 

G平行四边形

队友说这是个质数应该要用到原根,然后突然就过了?(流下了不会数学的泪水)

#include
using namespace std;
bool ck(int x,int mod){
	int ans=x*x%mod,k=2;
	while(ans!=1)ans=ans*x%mod,k++;
	return k==mod-1;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n;
		scanf("%d",&n);
		int p=n+1,g=0;
		for(int i=2;i

M最长公共子序列

这题先把1放在中间,然后维护一个从前到后的顺序,然后二分去确定每一个进来的数应该放在哪一个前面

每次询问就A[0]=i,A[1]=a[mid],如果a[mid]在i后面,则get_lcs=2,否则=1

刚好100*log约等于65

#include "lcs.h"
#include
using namespace std;
void find_permutation(int n, int res[])
{
	vectork;
	int A[3];
	k.push_back(1);
	int l=0,r=0,mid=0;
	for(int i=2;i<=n;i++){
		l=0,r=k.size()-1;
		while(l<=r){
			mid=l+r>>1;
			A[0]=k[mid],A[1]=i;		
			if(get_lcs(2,A)==1)r=mid-1;
			else l=mid+1;
		}
		if(l>mid)k.insert(k.begin()+mid+1,i);
		else k.insert(k.begin()+mid,i);
	}
	for(int i=0;i

 

N热身题

我数独也不会玩,太菜了,还好队友前一天晚上玩出来了

7 1 3 4 8 6 2 9 5
2 4 9 3 5 7 8 6 1
8 5 6 2 1 9 4 7 3
6 7 5 9 4 8 1 3 2
4 2 8 7 3 1 9 5 6
3 9 1 6 2 5 7 8 4
1 8 2 5 9 3 6 4 7
9 3 7 1 6 4 5 2 8
5 6 4 8 7 2 3 1 9

 

你可能感兴趣的:(2020年“美团杯”程序设计挑战赛 部分题解)