# 2013 成都网络赛 1003 1004 1007 1008 1010

1003是大水题

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 100010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
char ss[20]="nanodesu";
int main()
{
int t,i,j,l;
int Case=0;
char str[110];
scanf("%d",&t);
while(t--){
scanf("%s",&str);
l=strlen(str);
printf("Case #%d: ",++Case);
if(l>=4&&str[l-1]=='u'&&str[l-2]=='s'&&str[l-3]=='e'&&str[l-4]=='d'){
str[l-4]='\0';
printf("%s",str);
printf("%s\n",ss);
continue;
}
printf("%s",str);
printf("%s\n",ss);
}
return 0;
}
View Code

1004贪心

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 100010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int main()
{
int i,n,m,t,Case=1;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
printf("Case #%d: ",Case++);
if(m==1)
{
for(i=0;i<n;i++)
printf("a");
printf("\n");
}
else if(m>=3)
{
int l=n/3;
for(i=0;i<l;i++)
printf("abc");
if(n%3==1)
printf("a");
else if(n%3==2)
printf("ab");
printf("\n");
}
else if(n==1)
printf("a\n");
else if(n==2)
printf("ab\n");
else if(n==3)
printf("aab\n");
else if(n==4)
printf("aabb\n");
else if(n==5)
printf("aaaba\n");
else if(n==6)
printf("aaabab\n");
else if(n==7)
printf("aaababb\n");
else if(n==8)
printf("aaababbb\n");
else
{
int r=(n-2)%6;
int w=(n-2)/6;
printf("aa");
for(i=0;i<w;i++)
printf("aababb");
if(r<=4)
{
for(i=0;i<r;i++)
printf("a");
}
if(r==5)
printf("aaaab");
printf("\n");
}
}
return 0;
}
View Code

1007 动态规划

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char x[11],y[11];
int map[5000][11];
int c1,c2;
int w[]={1,2,4,8,16,32,64,128,256,512};
int jisuan(int a,int b)
{
if(b<0) return 0;
if(a==0) return 1;
if(map[b][a]>=0) return map[b][a];
if(a==1)
{map[b][a]=(10<=b?10:b+1);return map[b][a];}

int j,num=0;
for(j=0;j<=9;j++)
num+=jisuan(a-1,b-j*w[a-1]);
map[b][a]=num;
return num;
}
int main()
{
int i,j,n;
scanf("%d",&n);
memset(map,-1,sizeof(map));
for(j=1;j<=n;j++)
{
scanf("%s%s",&x,&y);
c1=strlen(x);c2=strlen(y);
int zs=0;
for(i=0;i<c1;i++)
zs+=(x[i]-'0')*w[c1-i-1];
int t=0,num=0;
while(t<c2)
{
if(t==c2-1)
{
if(zs>=0)
num+=(zs-(y[t]-'0')>=0 ? y[t]-'0'+1 : zs+1);
break;
}
for(i=0;i<=y[t]-'0';i++)
{
if(i==(y[t]-'0'))
{
zs-=i*w[c2-t-1];
break;
}
num+=jisuan(c2-t-1,zs-i*w[c2-t-1]);
}
t++;
}
printf("Case #%d: %d\n",j,num);
}
return 0;
}
View Code

1008 DLX 加个剪枝就行

#include<set>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 60
#define Maxm 80002
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 1000000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int D[Maxn*Maxn],U[Maxn*Maxn],L[Maxn*Maxn],R[Maxn*Maxn],S[Maxn*Maxn],C[Maxn*Maxn],H[Maxn],X[Maxn*Maxn],Q[Maxn*Maxn],id,d,n,K,cnt,f,ans;
int dis[60][60],ty[60];
bool vi[Maxn];
void init(int m)
{
int i;
for(i=0;i<=m;i++){
D[i]=U[i]=i;
L[i+1]=i;
R[i]=i+1;
S[i]=0;
}
R[m]=0;
id=m+1;
}
void ins(int r, int c)
{
U[id] = c;
D[id] = D[c];
U[D[c]] = id;
D[c] = id;
if (H[r] < 0)
H[r] = L[id] = R[id] = id;
else
{
L[id] = H[r];
R[id] = R[H[r]];
L[R[H[r]]] = id;
R[H[r]] = id;
}
S[c]++;
X[id]=r;
C[id++] = c;
}
void Remove(int c)
{
int i;
for(i=D[c];i!=c;i=D[i]){
L[R[i]]=L[i];
R[L[i]]=R[i];
}
}
void Resume(int c)
{
int i;
for(i=D[c];i!=c;i=D[i]){
L[R[i]]=i;
R[L[i]]=i;
}
}
int A()
{
int i,j,k,ret=0;
memset(vi,false,sizeof(vi));
for(i=R[0];i;i=R[i]) if(!vi[i]){
ret++;
for(j=D[i];j!=i;j=D[j]){
for(k=R[j];k!=j;k=R[k])
vi[C[k]]=true;
}
}
return ret;
}
void dfs(int step)
{
if(step+A()>K) return ;
int nn=0;
int i,j,temp,c;
for(i=0;i<step;i++){
nn+=ty[X[Q[i]]];
}
if(step-nn>=ans){
return ;
}
if(R[0]==0) {
f=1;
nn=0;
for(i=0;i<step;i++){
nn+=ty[X[Q[i]]];
}
ans=min(ans,step-nn);
return ;
}
temp=inf;
for(i=R[0];i;i=R[i]) if(S[i]<temp){
temp=S[i];
c=i;
}
for(i=D[c];i!=c;i=D[i]){
Q[step]=i;
Remove(i);
for(j=R[i];j!=i;j=R[j]){
Remove(j);
}
dfs(step+1);
for(j=R[i];j!=i;j=R[j])
Resume(j);
Resume(i);
}
return ;
}
void floyd()
{
int i,j,k;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
}
}
void build()
{
int i,j,k;
init(n);
for(i=1;i<=n;i++){
H[i]=-1;
for(j=1;j<=n;j++){
if(dis[i][j]<=d){
ins(i,j);
}
}
}
}
int main()
{
int t,i,j,u,v,val,Case=0;
scanf("%d",&t);
while(t--){
clr(dis,63);
K=0;
scanf("%d%d",&n,&d);
for(i=1;i<=n;i++){
scanf("%d",ty+i);
K+=ty[i];
dis[i][i]=0;
}
for(i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&val);
dis[u][v]=dis[v][u]=val;
}
floyd();
build();
f=0;
ans=inf;
dfs(0);
printf("Case #%d: ",++Case);
if(!f){
printf("-1\n");
continue;
}
printf("%d\n",ans);
}
return 0;
}
View Code

1010 单调队列

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 200010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int cnt[40],num[Maxn];
int que[Maxn];
int getnum(int val,int c)
{
int temp=val,cc=0;
int sum=0;
while(val){
if(val%2) cnt[cc]+=c;
val>>=1;
cc++;
}
for(int i=0;i<=30;i++)
if(cnt[i]){
sum+=(1<<i);
}
return sum;
}
int main()
{
int t,n,m,i,j,Case=0;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",num+i);
}
clr(cnt,0);
int temp;
LL ans=0;
for(i=1;i<=n;i++){
temp=getnum(num[i],1);
que[rear++]=i;
}
}