Codeforces Gym 100642 C D F

https://vjudge.net/contest/179568#overview


写了三个水题 = =


C:

奇怪模拟,需要首先dfs生成7的全排列。

#include <cstdio>
#include <iostream>
#include <string.h>
#include <string> 
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <stack>
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn=15,inf=0x3f3f3f3f;  
const ll llinf=0x3f3f3f3f3f3f3f3f;   
const ld pi=acos(-1.0L); 
int a[maxn][maxn];
int p[maxn][maxn];
int b[10005][maxn];
int u[maxn];
bool z[maxn];
int n;

void dfs(int len) {
	if (len==7) {
		n++;
		for (int i=0;i<7;i++) 
			b[n][i]=u[i];
		return;
	} else 
		for (int i=0;i<7;i++) 
			if (!z[i]) {
				z[i]=1;
				u[len]=i;
				dfs(len+1);
				z[i]=0;
			}
}

int main() {
	int cas,cnt=0;
	scanf("%d",&cas);
	n=0;
	mem0(z);
	dfs(0);
//	b[1][0]=3;b[1][1]=0;b[1][2]=5;b[1][3]=6;b[1][4]=1;b[1][5]=4;b[1][6]=2;
	while (cas--) {
		cnt++;
		int i,j;
		for (i=0;i<7;i++) {
			for (j=0;j<6;j++) {
				scanf("%d",&a[i][j]);
				p[i][a[i][j]]=j; 
			}
		}
		for (i=1;i<=n;i++) {
			int c=b[i][0],pos;
			pos=p[c][1];
			int flag=1;
			for (j=2;j<7;j++) {
				int d=(p[b[i][j]][a[c][(pos+1)%6]]+1)%6,
				e=(p[b[i][j-1]][a[c][pos]]+5)%6;
				if (a[b[i][j]][d]!=
				a[b[i][j-1]][e]) {
					flag=0;
					break;
				}
				pos=(pos+1)%6;
			}
			if (!flag) continue; else 
			if (a[b[i][1]][(p[b[i][1]][a[c][(pos+1)%6]]+1)%6]!=
				a[b[i][6]][(p[b[i][6]][a[c][pos]]+5)%6])
			continue; else break;
		}
		printf("Case %d:",cnt);
		if (i==n+1) printf(" No solution\n"); else {
			for (j=0;j<7;j++) printf(" %d",b[i][j]);
			printf("\n");
		}
	}
	return 0;
}


D:

给长度为6的序列分数字,要求数位和15.

同样的dfs生成所有情况

#include <cstdio>
#include <iostream>
#include <string.h>
#include <string> 
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <stack>
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
using namespace std;
typedef long long ll;
typedef long double ld;
const int inf=0x3f3f3f3f;  
const ll llinf=0x3f3f3f3f3f3f3f3f;   
const ld pi=acos(-1.0L);  
string a[1000000];
char c[5];
map<string,int> mp;
int num;

void dfs(int top,int pos,string s) {
//	cout << s << endl;
	if (pos==6) {
		a[num++]=s;
		return;
	}
	if (pos==5) {
		dfs(0,pos+1,s+((char)('a'+top)));
		return;
	}
	for (int i=top;i>=0;i--) {
		dfs(top-i,pos+1,s+((char)('a'+i)));
	}
}

int main() {
	int i,x;
	num=0;
	dfs(15,0,"");
	sort(a,a+num);
	for (i=0;i<num;i++) {
		mp[a[i]]=i;
	}
	scanf("%s",c);
	int cnt=0;
	while (c[0]!='e') {
		cnt++;
		printf("Case %d: ",cnt);
		if (c[0]=='m') {
			string p="";
			for (i=1;i<=6;i++) {
				scanf("%d",&x);
				p=p+((char)('a'+x));
			}
			printf("%d\n",mp[p]);
		} else {
			scanf("%d",&x);
			for (i=0;i<6;i++) {
				printf("%d ",a[x][i]-'a');
			}
			printf("\n");
		}
		scanf("%s",c);
	}
	return 0;
}



F:

字符串处理题。

最后时间不多了,没写出来。

还好最后还是过了

#include <cstdio>
#include <iostream>
#include <string.h>
#include <string> 
#include <map>
#include <queue>
#include <vector>
#include <set>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <stack>
#define mem0(a) memset(a,0,sizeof(a))
#define meminf(a) memset(a,0x3f,sizeof(a))
using namespace std;
typedef long long ll;
typedef long double ld;
const int maxn=1005,inf=0x3f3f3f3f;  
const ll llinf=0x3f3f3f3f3f3f3f3f;   
const ld pi=acos(-1.0L); 
int a[maxn][maxn];
string s;
int lenb[maxn],p[100005],mod[15]; 
bool z[1000005];

int main() {
	int cas,pppp=0;
	scanf("%d",&cas);
	mod[0]=1;
	for (int i=1;i<=8;i++) mod[i]=mod[i-1]*10;
	while (cas--) {
		pppp++;
		int i,j,l,w,n,len,num=0,maxlen=1,ans=0;
		scanf("%d%d",&n,&w);
		getchar();
		mem0(z);
		for (i=1;i<=n;i++) {
			getline(cin,s);
			len=s.length();
			int ns=0,cnt=0,flag=0;
			mem0(lenb);
			for (j=0;j<len;j++) {
				if (s[j]>='0'&&s[j]<='9') {
					if (!flag) ns++,flag=1;
					a[ns][lenb[ns]++]=s[j]-'0';
				} else if (flag) {
					flag=0;
				}
			}
			int u;
			for (len=maxlen;len<=maxlen+2;len++) {
			for (j=1;j<=ns;j++) {
				int now=0;
				for (l=0;l<len-1;l++) {
					now=now*10+a[j][l];
				}
				for (l=len-1;l<lenb[j];l++) {
					now=(now*10+a[j][l])%mod[len];
					if (now>num) p[++cnt]=now; 
				}
			}
		    }
		    sort(p+1,p+cnt+1);
		    j=1;
		    while (p[j]==num+1&&j<=cnt) {
		    	z[p[j]]=1;num++;
		    	while (z[num+1]) num++;
		    	ans=max(ans,p[j]);
		    	if (num>=mod[maxlen]-1) maxlen++;
		    	j++;
		    	while (p[j]<=num&&j<=cnt) j++;
		    }
		    while (p[j]<=num+w&&j<=cnt) {
		    	z[p[j]]=1;
		    	ans=max(ans,p[j]);
		    	j++;
		    }
		}
		printf("Case %d: %d %d\n",pppp,num,ans);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值