总体情况
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
思路
什么鬼.
//