Codeforces Round #238 (Div. 2)前3题解题报告

A. Gravity Flip

http://codeforces.com/problemset/problem/405/A


和2048好像啊,把格子向右移,排个升序就OK啦


#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cctype>
#include<cmath>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define sqr(x) (x)*(x)
#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.14159265358979
#define eps 1e-10
#define mm

using namespace std;

int a[1000];

int main()
{
	#ifndef ONLINE_JUDGE
		freopen("t","r",stdin);
	#endif

	int n;
	scanf("%d",&n);

	for (int i=0;i<n;i++)
         {

                  scanf("%d",&a[i]);
         }


	sort(a,a+n);

	for (int i=0;i<n;i++)
         {
                  printf("%d ",a[i]);
         }

	return 0;
}




B. Domino Effect

http://codeforces.com/problemset/problem/405/B


给出骨牌和推倒方向,求最后剩余的竖直骨牌,从左往右遍历一遍R,L内区间长度为奇数则+1


#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cctype>
#include<cmath>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define sqr(x) (x)*(x)
#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.14159265358979
#define eps 1e-10
#define mm

using namespace std;

int n;
char s[3333];
int ans=0;
int temp=0;//当前区间内暂时竖直的骨牌数量
bool R;

int main()
{
	#ifndef ONLINE_JUDGE
		freopen("t","r",stdin);
	#endif

	scanf("%d%s",&n,s);
	R=false;
	for (int i=0;i<n;i++)
	{
	         if (s[i]=='.')
                  {
                           temp++;
                  }
                  else
                  {
                           if (s[i]=='L')
                           {
                                    if (R)
                                    {
                                             ans+=(temp%2);
                                             temp=0;
                                    }
                                    else
                                    {
                                             temp=0;
                                    }
                                    R=false;
                           }
                           else
                           {
                                    ans+=temp;
                                    temp=0;
                                    R=true;
                           }
                  }

	}
	if (!R)
                  ans+=temp;        //见第二个样例

	printf("%d\n",ans);

	return 0;
}



C. Unusual Product

http://codeforces.com/problemset/problem/405/C


给出一个n×n的矩阵,它的值为对应行向量点乘对应列向量模2

有两种变换,1 将第i行中的0变为1,1变为0, 2将第i列中的0变为1,1变为0

求矩阵变换后对应的值


这个数据规模下,模拟肯定是要超时的,想想矩阵的变换,再想想模2后的值只有0和1两种,显然每次变换后矩阵的值k^=1

一开始没看到题目中对flip的解释,搞了好久。。。。


#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#include<cctype>
#include<cmath>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define sqr(x) (x)*(x)
#define LL long long
#define INF 0x3f3f3f3f
#define PI 3.14159265358979
#define eps 1e-10
#define mm

using namespace std;

int n,t,q1,q2;
int matrix[1001][1001];

void de()
{
         for (int i=0;i<n;i++)
         {
                  for (int j=0;j<n;j++)
                  {

                           printf("%d",matrix[i][j]);
                  }
                  puts("");
         }
         puts("___________________");
}

int cal()
{
         int sum=0;
         for (int i=0;i<n;i++)
         {
                  for (int j=0;j<n;j++)
                  {
                           sum+=(matrix[i][j]*matrix[j][i]);
                  }
         }
         return sum%2;
}

int main()
{
	#ifndef ONLINE_JUDGE
		freopen("t","r",stdin);
	#endif

	scanf("%d",&n);
	for (int i=0;i<n;i++)
         {
                  for (int j=0;j<n;j++)
                  {

                           scanf("%d",&matrix[i][j]);
                  }
         }

	scanf("%d",&t);

	int k=cal();

	for (int i=0;i<t;i++)
         {
                  scanf("%d",&q1);

                  if (q1==3)
                  {
                           printf("%d",k);
                  }

                  if (q1==1)
                  {
                           scanf("%d",&q2);
                           q2--;
/*
                           for (int j=0;j<n;j++)
                           {
                                   matrix[q2][j]=1^matrix[q2][j];
                           }
                           */
                           k=k^1;
                           //de();
                  }

                  if (q1==2)
                  {
                           scanf("%d",&q2);
                           q2--;
/*
                           for (int j=0;j<n;j++)
                           {
                                    matrix[j][q2]=1^matrix[j][q2];
                           }
                           */
                           k=k^1;
                           //de();
                  }


         }

	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值