您的位置:首页 > 其它

Codeforces Gym 100642 C D F

2017-08-16 19:27 375 查看
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
[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: