CSU 2019: Fleecing the Raffle 2020: Card Hand Sorting 2022: Artwork 2023: Bless You Autocorrect!

2019: Fleecing the Raffle

#include<iostream>
using namespace std;
int main(void)
{
    long long n,p ;
    while(cin>>n>>p)
    {
        double x = n/(p-1);
        double ans = 1;
        ans *= (double)p*x/(n+1);
        for(int i = 2;i <= p+1;++i)
            ans *= (double)(n-p+i)/(n + x -p+i-1);
        printf("%0.8f\n",ans);
    }
   return 0;
}

2020: Card Hand Sorting

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;

struct node_t{
    int val;
    int suit;
    int idx;
}p[60];

int increas[6],ssort[6];
bool cmp(node_t &a,node_t &b){
    if(a.suit==b.suit)
       return (increas[a.suit]&&a.val<b.val)||(!increas[a.suit]&&a.val>b.val);
    return ssort[a.suit]<ssort[b.suit];
}

int Idx[60],flag[6]={0};
int DP[60];
char s[3];
int ans,n;
int S_Int_val(char a){
    if('2'<=a&&a<='9')
        return a-'1';
    if(a=='T') return 9;
    if(a=='J') return 10;
    if(a=='Q') return 11;
    if(a=='K') return 12;
    return 13;
}

int S_Int_suit(char a){
    if(a=='s') return 1;
    if(a=='h') return 2;
    if(a=='d') return 3;
    return 4;
}

void dfs(int rt){
    if(rt==0){
        sort(p,p+n,cmp);
        for(int i=0;i<n;++i)
            Idx[p[i].idx]=i;

        DP[0]=1;
        int maxn=1;
        for(int i=1;i<n;++i){
            DP[i]=1;
            for(int j=0;j<i;++j)
                if(Idx[j]<Idx[i]) DP[i]=max(DP[j]+1,DP[i]);
            maxn=max(maxn,DP[i]);
        }
        ans=min(n-maxn,ans);

    }

    for(int i=1;i<=4;++i){
        if(flag[i])continue;
        flag[i]=1;
        ssort[rt]=i;
        dfs(rt-1);
        flag[i]=0;
    }
}

int main(){
    while(~scanf("%d",&n)){
        for(int i=0;i<n;++i){
            scanf("%s",s);
            p[i].val=S_Int_val(s[0]);
            p[i].suit=S_Int_suit(s[1]);
            p[i].idx=i;
        }

        ans=1e9;
        for(int i=0;i<(1<<4);++i){
            for(int j=0;j<4;++j)
                increas[j+1]=((1<<j)&i)?1:0;
            dfs(4);
        }
        printf("%d\n",ans);
    }

    return 0;
}

2022: Artwork

#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
typedef long long ll;
const int N=1e6+10;
using namespace std;

int X[4]={0,0,-1,1};
int Y[4]={1,-1,0,0};

struct query{int x1,y1,x2,y2;} Q[10010];

int n,m,q,f[N],num[1010][1010],p[1010][1010];
int ans[10010],tot=0; bool v[N];

int find(int x)
{
	return f[x]==x?x:f[x]=find(f[x]);
}

bool check(int x,int y)
{
	if (x<=0||y<=0||x>n||y>m) return 0;
	return 1;
}

void work(int x,int y)
{
	tot++;
	f[num[x][y]]=num[x][y];
	for(int k=0;k<4;k++)
	{
		int xx=x+X[k],yy=y+Y[k];
		if (!check(xx,yy)||p[xx][yy]) continue;
		if (find(num[xx][yy])==find(num[x][y])) continue;
		f[find(num[xx][yy])]=find(num[x][y]); tot--;
	}
}

int main(){
	int no=0;
	scanf("%d%d%d",&m,&n,&q);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			num[i][j]=++no,f[no]=no;
	for(int i=1;i<=q;i++)
	{
		int x1,y1,x2,y2;
		scanf("%d%d%d%d",&y1,&x1,&y2,&x2);
		if (x1==x2)
		{
			if (y1>y2) swap(y1,y2);
			for(int j=y1;j<=y2;j++) p[x1][j]++;
		} else
		{
			if (x1>x2) swap(x1,x2);
			for(int j=x1;j<=x2;j++) p[j][y1]++;
		}
		Q[i]=query{x1,y1,x2,y2};
	}

	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			if (p[i][j]) continue;
			for(int k=0;k<4;k++)
			{
				int xx=i+X[k],yy=j+Y[k];
				if (!check(xx,yy)) continue;
				if (p[xx][yy]) continue;
				if (find(num[xx][yy])==find(num[i][j])) continue;
				f[find(num[xx][yy])]=find(num[i][j]);
			}
		}

	memset(v,0,sizeof(v));
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
		{
			if (p[i][j]) continue;
			int fa=find(num[i][j]);
			if (v[fa]) continue;
			v[fa]=1; tot++;
		}
	ans[q]=tot;

	for(int k=q;k>=2;k--)
	{
		if (Q[k].x1==Q[k].x2)
		{
			for(int i=Q[k].y1;i<=Q[k].y2;i++)
				if (!--p[Q[k].x1][i]) work(Q[k].x1,i);
		} else
		{
			for(int i=Q[k].x1;i<=Q[k].x2;i++)
				if (!--p[i][Q[k].y2]) work(i,Q[k].y2);
		}
		ans[k-1]=tot;
	}
	for(int i=1;i<=q;i++)
		printf("%d\n",ans[i]);
	return 0;
}

2023: Bless You Autocorrect!

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
#include<queue>
#define N 1000010
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
using namespace std;

char s[N];
int n,m;

struct Trie
{
    struct node{int ch[28],cnt;}T[N];
    int tot,root,d[N]; bool v[N];
    void init(){tot=root=1;}

    int newnode()
    {
        ++tot;
        for(int i=0;i<28;i++)
            T[tot].ch[i]=0;
        T[tot].cnt=0;
        return tot;
    }

    void ins(char* x)
    {
        int o=root;
        vector<int> point;
        for(int k=0;x[k];k++)
        {
            int c=x[k]-'a';
            if (!T[o].ch[c]) T[o].ch[c]=newnode();
            if (!T[o].ch[26]&&!T[o].cnt) point.push_back(o);
            T[T[o].ch[c]].ch[27]=o; o=T[o].ch[c];
        }
        T[o].cnt++;
        for(int i=0;i<point.size();i++)
            if (point[i]!=root) T[point[i]].ch[26]=o;
    }

    void bfs()
    {
        queue<int> q;
        memset(v,0,sizeof(v));
        q.push(root); d[root]=0; v[root]=1;
        while(!q.empty())
        {
            int x=q.front();q.pop();
            for(int i=0;i<28;i++)
            {
                int y=T[x].ch[i];
                if (y==0||v[y]) continue;
                v[y]=1; d[y]=d[x]+1; q.push(y);
            }
        }
    }

    int query(char* x)
    {
        int o=root,k;
        for(k=0;x[k];k++)
        {
            int c=x[k]-'a';
            if (T[o].ch[c]==0) break;
            o=T[o].ch[c];
        }
        return d[o]+strlen(x)-k;
    }
} Trie;




int main()
{
    //file(x);
    while(cin>>n>>m)
    {
        Trie.init();
        while(n--)
        {
            scanf("%s",s);
            Trie.ins(s);
        }
        Trie.bfs();
        while(m--)
        {
            scanf("%s",s);
            printf("%d\n",Trie.query(s));
        }
        puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/nameofcsdn/article/details/80468109
今日推荐