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

来源:互联网 发布:贵阳浪人网络 编辑:程序博客网 时间:2024/05/18 15:52

  • 总体情况
  • T1
    • 思路
  • T2
    • 思路
  • T3
    • 思路
  • T4
    • 思路
  • T5
    • 思路

总体情况

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

思路

什么鬼.

//
原创粉丝点击