11.30
快四级考了;又临近期中考;题量有所下降;并且部分算法仍然有疑惑;
看来又得继续忙了
新加了vj的训练题;
USACO 1.4.2
这题是USACO里最暴力 的一题``
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<vector>
#include<algorithm>
using namespace std;
int a[20];int c[20];
int b[10][10]=
{
{3,3,0,3,3,0,0,0,0},
{3,3,3,0,0,0,0,0,0},
{0,3,3,0,3,3,0,0,0},
{3,0,0,3,0,0,3,0,0},
{0,3,0,3,3,3,0,3,0},
{0,0,3,0,0,3,0,0,3},
{0,0,0,3,3,0,3,3,0},
{0,0,0,0,0,0,3,3,3},
{0,0,0,0,3,3,0,3,3}
};//记录方法;
bool p(int a[9])//判断是不是全为12点;
{
for(int i=0;i<9;i++)
{
if(a[i]%12!=0)return 0;
}
return 1;
}
int main()
{
for(int i=0;i<9;i++)
{
scanf("%d",&a[i]);
}
bool f=0;int fangfa[10]={0};//每种方法最多使用3次
//下面是9次可怕的循环;
for(fangfa[0]=0;fangfa[0]<=3;fangfa[0]++)
{
for(fangfa[1]=0;fangfa[1]<=3;fangfa[1]++)
{
for(fangfa[2]=0;fangfa[2]<=3;fangfa[2]++)
{
for(fangfa[3]=0;fangfa[3]<=3;fangfa[3]++)
{
for(fangfa[4]=0;fangfa[4]<=3;fangfa[4]++)
{
for(fangfa[5]=0;fangfa[5]<=3;fangfa[5]++)
{
for(fangfa[6]=0;fangfa[6]<=3;fangfa[6]++)
{
for(fangfa[7]=0;fangfa[7]<=3;fangfa[7]++)
{
for(fangfa[8]=0;fangfa[8]<=3;fangfa[8]++)
{
for(int i=0;i<9;i++)
{
c[i]=a[i];
}
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
c[j]+=b[i][j]*fangfa[i];
}
}
if(p(c))
{
for(int i=0;i<9;i++)
{
for(fangfa[i];fangfa[i]>0;fangfa[i]--)
//按照方法数输出各方法使用;
{
cout<<i+1<<' ';
}
}
return 0;
}
}
}
}
}
}
}
}
}
}
return 0;
}
USACO 1.4.3
这题利用结构体数组存a,b;
根据题意 标记自然数集内(指<=m*m)所有的双平方数;
然后根据起点a,步长b,长度;进行判定;
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<functional>
#include<cstdio>
using namespace std;
struct nuo
{
int a,b;
};
const int t=250*250*2;
bool f[t+10]={0};
nuo cc[10010];
bool jp(int h,int q,int v)
{
for(int i=0;i<v;i++)
{
if(!f[h+q*i])return 0;
}
return 1;
}
bool cmp(nuo x,nuo y)
{
return x.b<y.b;
}
int main()
{
int n;scanf("%d",&n);
int m;scanf("%d",&m);
for(int i=0;i<=m;i++)
{
for(int j=i;j<=m;j++)
{
f[i*i+j*j]=1;
}
}
int d=0;
for(int i=0;i<=m*m*2;i++)
{
for(int j=1;;j++)
{
if(i+j*(n-1)>m*m*2)break;
else if(jp(i,j,n))
{
cc[d].a=i;cc[d].b=j;
d++;
}
}
}
if(d==0)printf("NONE");
sort(cc,cc+d,cmp);//根据b排序,a大小已排好
for(int i=0;i<d;i++)
{
printf("%d %d\n",cc[i].a,cc[i].b);
}
return 0;
}
51nod-1046
这题用了快速幂取模;
原理如下(ab%c)=(a%c)(b%c)%c;
只要把a^b当作多次上式的运用即可;(解决了数据超限的问题)
为减少时间复杂度 使用快速幂;
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
long long a, b, c;
cin >> a >> b >> c; long long d = 1;
a = a%c;//第一次取模
while (b)
{
if (b &1)d = (d * a) % c;//快速幂第一次赋值
b >>=1;
a = (a * a) % c;//赋值前a的运算
}
cout << d;
return 0;
}
HDU-1230
运算模拟题;
实际上就是一种另类的高精度运算;模拟过程不难;输入是问题;
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int jz[30]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};//粗存进制
int main()
{
char c;int a[30]={0},b[30]={0},d[30]={0};int i=0,j=0;
while(1)
{
//cout<<x1<<' '<<x2<<endl;
for(;;)
{
scanf("%d%c",&a[i],&c);//注意输入
if(c==' ')break;
else i++;
}
for(;;)
{
scanf("%d%c",&b[j],&c);//注意输入
if(c=='\n')break;
else j++;
}
i++;j++;
if(a[0]==0&&b[0]==0)return 0;
for(int e=0;e<i/2;e++)
{
swap(a[e],a[i-1-e]);
}
for(int e=0;e<j/2;e++)
{
swap(b[e],b[j-1-e]);
}
int y=max(i,j)+1;
for(int e=0;e<y;e++)
{
d[e]+=a[e]+b[e];
d[e+1]+=d[e]/jz[e];
d[e]%=jz[e];
}
while(d[y]==0&&y>0)
{
y--;
}
for(int e=y;e>=0;e--)
{
cout<<d[e];
if(e!=0)cout<<',';
}
cout<<endl;
for(int e=0;e<max(i,j)+1;e++)
{
a[e]=0;b[e]=0;d[e]=0;
}
i=0;j=0;
}
return 0;
}
这里的输入我是借鉴了输入借鉴传送