您的位置:首页 > 其它

[Codeforces]Round246 div2 解题报告

2014-09-10 22:31 417 查看
第一次上1700
顺便把没做出来的题都写了,纪念一下吧。

A. inc ARG

题目大意

一个二进制数倒序输入

超过n位的数字将被丢弃

求给定数字+1后改变的数字位数

阅读理解,直接模拟,刷榜水题

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>

#define sqr(x) ((x)*(x))
#define LL long long 
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define eps 1e-10
#define mod 998244353ll
using namespace std;
int a[5005],b[505];
int main()
{
	int n;
	while (~scanf("%d",&n))
	{
		char c;
		c=getchar();
		for (int i=1;i<=n;i++)
		{
			scanf("%c",&c);
			a[i]=c-'0';
		}
		c=getchar();
		for (int i=1;i<=n;i++)
			b[i]=a[i];
		b[1]++;
		for (int i=1;i<=n;i++)
			if(b[i]==2)
			{
				b[i+1]++;
				b[i]=0;
			}
		int ans=0;
		for (int i=1;i<=n;i++)
			if (a[i]!=b[i]) ans++;
		printf("%d\n",ans);

	}
}


B. Inbox (100500)

题目大意

一个邮箱有n封邮件,每一封邮件都有已读(0)和未读(1)两个状态

每秒钟可以

1)返回邮件列表

2)进入某一封信

3)查看上/下一封信

问所有邮件变为已读的最短时间

我们发现一旦对于连续的1后面接上的0,如果只有一个,那跳出再进入的代价和连续翻两页的代价一致。而如果0超过了两个,那直接跳出更划算。

则1后面遇到0就跳出(特判后面没有未读信的情况),0后面遇到1就进入,1后面遇到1就向下滑动一页,否则不做处理。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>

#define sqr(x) ((x)*(x))
#define LL long long 
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define eps 1e-10
#define mod 998244353ll
using namespace std;
int a[5005];
int sum[5005];
int main()
{
	int n;
	while (~scanf("%d",&n))
	{
		memset(a,0,sizeof a);
		memset(sum,0,sizeof sum);
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
		}
		for (int i=n;i>=1;i--)
		{
			sum[i]=sum[i+1]+a[i];
		}
		int ans=0;
		for (int i=1;i<=n;i++)
			{
			if (a[i-1]==0&&a[i]==1) ans++;
			if (a[i-1]==1&&a[i]==1) ans++;
			if ((a[i-1]==1&&a[i]==0)&&sum[i]) ans++;
			}
		printf("%d\n",ans);
	}
}


C. No to Palindromes!

题目大意

给定无回文字符串的定义:其任意连续子串都不是回文

给定一个无回文,长度为n,最大的字母,问按字典序其下一个无回文是什么

观察性质

则对于 i>=1 有s[i-1]!=s[i]

则对于 i>=2 有s[i-2]!=s[i]

直接从最后一位自增,如果没有办法自增就考虑字母顺序换掉上一位

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>

#define sqr(x) ((x)*(x))
#define LL long long 
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define eps 1e-10
#define mod 998244353ll
using namespace std;
char a[1005];
char s[1005];
int flag;
int n,p;

int check (int x)
{
	 return ((n<2||(a[x-1]!=a[x-2]))&&((n<3)||(a[x-1]!=a[x-3])));
}
int main()
{
	while (~scanf("%d%d",&n,&p))
	{
		flag=0;
		char c;
		c=getchar();
		scanf("%s",a);
		int pt=n;
		while (flag==0)
		{
			if (pt==0) break;

			a[pt-1]++;
			if (a[pt-1]>'a'+p-1) {
				pt--;continue;
			}
			if (check(pt)==0){
				continue;
			}
			if (check(pt)){
				if (pt==n) {flag=1;break;}
				else {pt++;a[pt-1]='a'-1;continue;}
			}
		}
		if (flag==0) puts("NO");
		else printf("%s\n",a);
	}
}


D. Restore Cube

题目大意

一个正方体的八个坐标被更换(x,y,z乱序)

求是否存在原来的正方形

任输出一种方案

6^7暴力

我的判断方法是计算是否有12条棱12个面对角线4个体对角线(因为有向所以*2)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>

#define sqr(x) ((x)*(x))
#define LL long long 
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define eps 1e-10
using namespace std;
int flag;
struct node
{
	LL x,y,z;
};
node t[10];
LL tmp[10][10];
int k;
LL dis(node a,node b)
{
	return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}
void print()
{
	puts("YES");
	for (int i=1;i<=8;i++)
		printf("%I64d %I64d %I64d\n",t[i].x,t[i].y,t[i].z);
	flag=1;
}
void detect()
{
	k++;
	if (flag==1) return ;
	LL mi=1e18;
	for (int i=1;i<=8;i++)
		for (int j=1;j<=8;j++)
			if (i!=j)
				mi=min(mi,tmp[i][j]=dis(t[i],t[j]));
	int cnt1=0;
	int cnt2=0;
	int cnt3=0;
	if (mi==0) return ;
	for (int i=1;i<=8;i++)
		for (int j=1;j<=8;j++)
			if (i!=j)
			{
				if (mi==tmp[i][j]) cnt1++; 
				if (mi*2==tmp[i][j]) cnt2++; 
				if (mi*3==tmp[i][j]) cnt3++; 
			}
	if (cnt1==24)
		if (cnt2==24)
			if (cnt3==8)
				print();
}
void dfs(int x)
{
	if (flag==1) return ;
	if (x>8) {
		detect();
		return ;
	}
	dfs(x+1);
	swap(t[x].y,t[x].z);
	dfs(x+1);
	swap(t[x].x,t[x].y);
	dfs(x+1);
	swap(t[x].y,t[x].z);
	dfs(x+1);
	swap(t[x].y,t[x].x);
	dfs(x+1);
	swap(t[x].y,t[x].z);
	dfs(x+1);
}
int main()
{
	while (~scanf("%I64d%I64d%I64d",&t[1].x,&t[1].y,&t[1].z))
	{
		flag=0;
		k=0;
		for (int i=2;i<=8;i++)
		scanf("%I64d%I64d%I64d",&t[i].x,&t[i].y,&t[i].z);
		// puts("QUQ");
		dfs(2);
		if (flag==0) puts("NO");
		// printf("%d\n",k);
	}
}


E. Substitutes in Number

题目大意

长度为n的数

m次变换 每次变换将其中的一位数(所有等于x的都算)变为y,可能为一串数,一个数,或空串。

求m次变换后的数字模1e9+7的结果

倒着dp

每一步存放数字x表示的最终的数字串,和x表示的数字位数(1^n%(1e9+7))

最后扫一遍原来的字符串就可以算出结果

#include <cstdio>
#include <string>
#include <cstring>
#define LL long long
#define mod 1000000007ll
using namespace std;
LL pos[20],num[20];
string s[100005];
char p[100005],c;
int main()
{
    int n;
    while (~scanf("%s%d",p,&n))
    {
        c=getchar();
        for (int i=1;i<=n;i++)
        {
            s[i]="";
            while ((c=getchar())!='\n')
                s[i]=s[i]+c;
        }
        for (int i=0;i<10;i++)
        {
            pos[i]=10;
            num[i]=i;
        }
        LL tnum,tpos;
        for (int i=n;i;i--)
        {
            tnum=0;
            tpos=1;
            int l=s[i].size();
            for (int j=l-1;j>2;j--)
            {
                tnum=(tnum+(tpos*num[s[i][j]-'0'])%mod)%mod;
                tpos=tpos*pos[s[i][j]-'0']%mod;
            }
            // printf("%I64d %I64d \n",tnum,tpos);
                pos[s[i][0]-'0']=tpos;
                num[s[i][0]-'0']=tnum;
        }
        int l=strlen(p);

        tnum=0;
        tpos=1;
        for (int j=l-1;j>=0;j--)
        {
            tnum=(tnum+(tpos*num[p[j]-'0'])%mod)%mod;
            tpos=tpos*pos[p[j]-'0']%mod;
        }
        printf("%I64d\n",tnum);

    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: