奋斗群群赛17总结与心得(未完)

总体情况

http://codeforces.com/contest/11
本次群赛从codeforces里选了第11套题.像我这种蒟蒻能做出A已经是万幸了.
我接下来的题目都不写题意了.

T1

思路

直接模拟TLE,我用一些方法减少了循环的次数.

#include<bits/stdc++.h>
using namespace std;
long long a[5000];
int main()
{
long long n,i,d,s=0,t;
scanf("%I64d%I64d",&n,&d);
for (i=1;i<=n;i++) scanf("%I64d",&a[i]);
for (i=1;i<n;i++) if (a[i]>=a[i+1])
  {
  t=(a[i]-a[i+1])/d+1;//除法,看看能加多少次.
  a[i+1]+=t*d;
  s+=t;
  }
printf("%I64d",s);
}

T2

我看到题推了几下,然后跪了.

思路

如果说a步能走到n,说明1-a的和必与n同奇偶.这样的话稍微压压行只需要1个for循环就可以了.

#include<bits/stdc++.h>
int n,i,s;
main()
{
std::cin>>n;
for (n=abs(n);s<n||s%2!=n%2;s+=i) i++;
std::cout<<i; 
}

T3

思路

这题想必是个dfs,搜索一下有多少正方形和斜着的正方形.

#include<bits/stdc++.h>
using namespace std;
const int x[9]={0,1,0,-1,1,1,-1,-1},y[9]={1,0,-1,0,1,-1,1,-1};
int n,m,s;char norie[310][310];
void dfs(int p,int q,int &s)
{
if (p<0||p>=n||q<0||q>=m||norie[p][q]!='1') return;
norie[p][q]='2',s++;
for (int i=0;i<8;i++) dfs(p+x[i],q+y[i],s);
}
bool solve(int p,int q,int d,int l,int r)
{
int i,j;
for (i=0;i<=d;i++) for (j=l;j<r;j++) if (p+x[j]*i<0||p+x[j]*i>=n||q+y[j]*i<0||q+y[j]*i>=m||norie[p+x[j]*i][q+y[j]*i]!='2') return 0;
return 1;
}
int main()
{
int i,j,t;
for (scanf("%d",&t);t--;)
  {
  scanf("%d%d",&n,&m);
  for (i=0;i<n;i++) scanf("%s",norie[i]);
  int answer=0;
  for (i=0;i<n;i++) for (j=0;j<m;j++) if (norie[i][j]=='1') 
    {
    dfs(i,j,s=0);
    if (s%4||s/4>min(n,m)) continue;
    answer+=solve(i,j,s/4,0,2)&&solve(i+s/4,j+s/4,s/4,2,4);
    answer+=solve(i,j,s/4,4,6)&&solve(i+s/2,j,s/4,6,8);
    }
  printf("%d\n",answer);
  }
}

T4

思路

状压dp,然而我dp超级差.

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int boss=1e6;
ll answer,dp[boss+10][20];
int bits[20],w[20],n,m,edge[boss+10],state;
int main()
{
int i,j,k,u,v;
scanf("%d%d",&n,&m);
for (i=0;i<=n;i++) bits[i]=1<<i;
for (i=1;i<=m;i++) 
  {
  scanf("%d%d",&u,&v);
  w[u-1]|=bits[v-1],w[v-1]|=bits[u-1];
  }
for (i=1;i<=bits[n];i++)
  {
  for (state=0;state<n;state++) if (i&bits[state]) break;
  if (i==bits[state]) 
    {
    dp[i][state]=edge[i]=1;
    continue;
    }
  edge[i]=edge[i^bits[state]]+1;
  for (j=state+1;j<n;j++) if (i&bits[j])
    {
    for (k=0;k<n;k++) if (w[j]&bits[k]) dp[i][j]+=dp[i^bits[j]][k];
    if (w[j]&bits[state]&&edge[i]>2) answer+=dp[i][j];
    }
  }
printf("%I64d",answer/2);
}

T5

思路

什么鬼.

//
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值