CSU Monthly 2012 Aug.

2024-02-08 01:38
文章标签 2012 monthly aug csu

本文主要是介绍CSU Monthly 2012 Aug.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 http://acm.csu.edu.cn/OnlineJudge/contest.php?cid=2026


这次参加比赛,结果就被完虐了

B题 我用的bfs ,随便写写竟然1A,我以为题目肯定还有我没有考虑到的情况

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
const int maxn=100100;int degree[maxn],vis[maxn],head[maxn],tot,n,m;
struct Edge
{int u,v,next;
}e[maxn];
void addegde(int a,int b)
{e[tot].u=a,e[tot].v=b,e[tot].next=head[a],head[a]=tot++;
}
int que[maxn],dp[maxn];
int bfs()
{int l=0,r=0;que[r++]=1;memset(dp,-1,sizeof(dp));dp[1]=0;memset(vis,0,sizeof(vis));while(l<r){int u=que[l++];vis[u]=0;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].v;if(dp[v]==-1||dp[v]>dp[u]+degree[u]-1){dp[v]=dp[u]+degree[u]-1;if(!vis[v]) que[r++]=v,vis[v]=1;}}}return dp[n];
}
int main()
{int a,b;while(scanf("%d %d",&n,&m)==2){memset(head,-1,sizeof(head));memset(degree,0,sizeof(degree));tot=0;while(m--){scanf("%d%d",&a,&b);addegde(a,b);degree[a]++;}printf("%d\n",bfs());}return 0;
}

C题 我开始还以为是抽象成二分图,后来想想都不对,又以为是网络流,在保证最大流的前提下,费用最小,但是我不会建模……悲剧的只能自己yy了,题目的每个串都可以

抽象成4种不同的类型,分别是 小小 大大 小大  大小,然后贪心就可以了。1A

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;int x1,x2,x3,x4;
char word[1100];int main()
{int n;while(scanf("%d",&n)==1){x1=x2=x3=x4=0;int ans=0;for(int i=0;i<n;i++){scanf("%s",word);int cnt=0,len=strlen(word);for(int j=1;j<len;j++){bool pre=islower(word[j-1]);bool now=islower(word[j]);if(pre!=now) cnt++;}ans+=cnt;if(islower(word[0])&&islower(word[len-1])) x1++;else if(islower(word[0])&&!islower(word[len-1])) x2++;else if(!islower(word[0])&&islower(word[len-1])) x3++;else x4++;}//cout<<x1<<" "<<x2<<" "<<x3<<" "<<x4<<endl;//cout<<ans<<endl;if(x2) x2--;else ans++;if(x3>=x2){if(x3>x2+1) ans+=x3-x2-1;}elseans+=x2-x3;printf("%d\n",ans);}return 0;
}

G 题就是线段树加简单dp 的水题,用线段树来查找一段范围内的最大值就行了,1A

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
const int maxn=100100;
const int inf=99999999;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1int d[maxn];
struct Node
{int kind,v,happy;
}item[maxn];void update(int p,int val,int l,int r,int rt)
{if(l==r){d[rt]=max(d[rt],val);return;}int m=(l+r)>>1;if(p<=m) update(p,val,lson);else update(p,val,rson);d[rt]=max(d[rt<<1],d[rt<<1|1]);
}
int query(int L,int R,int l,int r,int rt)
{if(L<=l&&R>=r)return d[rt];int m=(l+r)>>1;int ret1=-1,ret2=-1;if(L<=m) ret1=query(L,R,lson);if(R>m) ret2=query(L,R,rson);return max(ret1,ret2);
}
int cmp(Node a,Node b)
{return a.kind < b.kind;
}
int main()
{int N,C,V;while(scanf("%d%d%d",&N,&C,&V)==3){for(int i=0;i<N;i++)scanf("%d%d%d",&item[i].kind,&item[i].v,&item[i].happy);sort(item,item+N,cmp);memset(d,-1,sizeof(d));int ans=-1,pre=0;/* for(int i=0;i<N;i++)cout<<item[i].kind<<" "<<item[i].v<<endl;cout<<endl;*/for(int i=0;i<N;i++)if(item[i].kind==item[pre].kind){if(item[i].v >= V ) continue;int Max=query(1,V-item[i].v,1,V,1);//cout<<Max<<endl;if(Max!=-1) ans=max(ans,Max+item[i].happy);}else{for(int j=pre;j<i;j++)if(item[j].v<V ) update(item[j].v,item[j].happy,1,V,1);pre=i;i--;}printf("%d\n",ans);}return 0;
}

H 题我真不知道贪心是否正确,就是每次浇水都选择最矮的那棵树浇水,抱着试试看的态度叫了,每次取最优值,竟然1A

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int inf=99999999;
const int maxn=100010;
int height[maxn],rat[maxn],d[maxn<<2];void build(int l,int r,int rt)
{if(l==r){d[rt]=height[l];return;}int m=(l+r)>>1;build(lson);build(rson);d[rt]=min(d[rt<<1],d[rt<<1|1]);
}void update(int p,int val,int l,int r,int rt)
{if(l==r){d[rt]=val;return;}int m=(l+r)>>1;if(p<=m) update(p,val,lson);else update(p,val,rson);d[rt]=min(d[rt<<1],d[rt<<1|1]);
}
int query(int l,int r,int rt)
{if(l==r) return l;int m=(l+r)>>1;if(d[rt<<1]<=d[rt<<1|1]) return query(lson);else return query(rson);
}
int main()
{int N,K;while(scanf("%d %d",&N,&K)==2){int minp=1,maxp=1;for(int i=1;i<=N;i++){scanf("%d %d",&height[i],&rat[i]);if(height[i]>height[maxp]) maxp=i;if(height[i]<height[minp]) minp=i;}//cout<<minp<<" "<<maxp<<endl;build(1,N,1);int ans=height[maxp]-height[minp];for(int i=1;i<=K;i++){if(ans==0) break;height[minp]+=rat[minp];update(minp,height[minp],1,N,1);if(height[minp]>height[maxp]) maxp=minp;minp=query(1,N,1);ans=min(ans,height[maxp]-height[minp]);}printf("%d\n",ans);}return 0;
}

然后没做出来题目了,E题是比赛后写的,就是蛋疼的搜索+剪枝

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>using namespace std;
const int maxn=15;
const int inf=99999999;char map[maxn][maxn][maxn];
int fast[maxn][maxn][maxn],n,m,k;
int dir[][2]= {{0,1},{0,-1},{1,0},{-1,0}},qx[maxn*maxn*maxn],qy[maxn*maxn*maxn],qz[maxn*maxn*maxn];
bool vis[maxn][maxn][maxn];
int ans,best;bool isok(int x,int y,int z)
{if(x>=1&&x<=n&&y>=1&&y<=m&&z>=1&z<=m) return 1;return 0;
}
void bfs()
{memset(vis,0,sizeof(vis));int rr=0,l=0;for(int j=1; j<=m; j++)for(int r=1; r<=m; r++)if(map[1][j][r]=='U') qx[rr]=1,qy[rr]=j,qz[rr++]=r,fast[1][j][r]=1,vis[1][j][r]=1;//cout<<rr<<endl;while(l<rr){int curx=qx[l],cury=qy[l],curz=qz[l++],nx,ny,nz;for(int i=0; i<6; i++){if(i<4){nx=curx;ny=cury+dir[i][0];nz=curz+dir[i][1];}else if(i==4) nx=curx+1,ny=cury,nz=curz;else nx=curx-1,ny=cury,nz=curz;if(!isok(nx,ny,nz)) continue;if(i==4&&map[nx][ny][nz]!='U') continue;if(i==5&&map[nx][ny][nz]!='D') continue;if(!vis[nx][ny][nz]){vis[nx][ny][nz]=1;fast[nx][ny][nz]=fast[curx][cury][curz]+1;qx[rr]=nx,qy[rr]=ny,qz[rr++]=nz;}}}
}
void dfs(int x,int y,int z,int tim,int wealth)
{if(ans==best) return;if( n-tim/k+1<=x ) return;if(fast[x][y][z]+tim-1>=n*k) return;if(x==1&&map[1][y][z]=='U'){ans=max(ans,wealth);return;}vis[x][y][z]=1;int nx,ny,nz;for(int i=0; i<6; i++){if(i<4){nx=x;ny=y+dir[i][0];nz=z+dir[i][1];}else if(i==4) nx=x+1,ny=y,nz=z;else nx=x-1,ny=y,nz=z;if(!isok(nx,ny,nz)) continue;if(i==4&&map[x][y][z]!='D') continue;if(i==5&&map[x][y][z]!='U') continue;//cout<<nx<<" "<<ny<<" "<<nz<<" bug "<<endl;if(!vis[nx][ny][nz])dfs(nx,ny,nz,tim+1,wealth+ (map[nx][ny][nz]=='#') );}vis[x][y][z]=0;
}
int main()
{int sx,sy,sz;while(scanf("%d %d %d",&n,&m,&k)==3){best=0;for(int i=1; i<=n; i++)for(int j=1; j<=m; j++)for(int r=1; r<=m; r++){cin>>map[i][j][r];if(map[i][j][r]=='S') sx=i,sy=j,sz=r;fast[i][j][r]=inf;if(map[i][j][r]=='#') best++;}bfs();memset(vis,0,sizeof(vis));ans=-1;dfs(sx,sy,sz,0,0);printf("%d\n",ans);}return 0;
}


这篇关于CSU Monthly 2012 Aug.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/689551

相关文章

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

VS2010与2012项目类型选择,MFC

今天装了了一个 VS2012,  在用向导创建工程的时候,发现在项目类型选择的时候,我们要去观察室继承的谁,VS2010项目类型选择,MFC,mainfrm 继承是cframewnd,而VS2012,继承是CframewndEX    区别好大

Windows Server 2019 中文版、英文版下载 (updated Aug 2024)

Windows Server 2019 中文版、英文版下载 (updated Aug 2024) Windows Server 2019 Version 1809 请访问原文链接:https://sysin.org/blog/windows-server-2019/,查看最新版。原创作品,转载请保留出处。 本站将不定期发布官方原版风格月度更新 ISO。 Windows Server

VOC 2012 augment 数据集 data augmentation 10582到底哪来的

根据deeplabv3+官方,train_aug 数据应该有10582.   你只需要准备两个文件夹,一个list.txt,三个数据: 官方提供的VOC2012的JEPGImages 文件夹(也就是全部的彩色照片)SBD数据库的数据扩增标注该标注对应的list(复制粘贴) 也就是说,SBD使用的是原始图片,没有平移旋转,所以你不需要下载他们提供的那个1G多压缩包,只需要下个40M标注。

Windows 7 Windows Server 2008 R2 简体中文版下载 (updated Aug 2024)

Windows 7 & Windows Server 2008 R2 简体中文版下载 (updated Aug 2024) Windows 7 & Windows Server 2008 R2 (2024 年 8 月更新) 请访问原文链接:https://sysin.org/blog/windows-7/,查看最新版。原创作品,转载请保留出处。 Windows 7 & Windows S

2012年4月11日GMAT数学考试机经回忆(十二)

二零一(残狗 一个公司一共有W个人,然后平均分到三个team里面去,多出一个人来。。。问下面哪个选项可能是三个组的人数,每个选项3个表达式,都是分母为3,分子是什么w-1,w+1或者w+2之类的(大家能懂吧。。。 (提供者ID:大黄蜂2012 思路:“每个选项3个表达式”,是所有可能性么?求补充,求讨论; 分成三组后多出一人,即w/3余数为1,则(w-1可以被3整除,同理w+2,w-4等都

2012年12月21日SAT数学每日一题

下面是一道SAT数学 练习题,请自行完成后参看答案和解析。   Read the following SAT test question, then click on a button to select your answer.   There are n students in a biology class, and only 6 of them are seniors. If 7

2012-2022年各省新质生产力匹配数字经济数据

2012-2022年各省新质生产力匹配数字经济数据 1、时间:2012-2022年 2、来源:各省年鉴、能源年鉴、工业年鉴、统计年鉴 3、指标:prov、year、gdp亿元、在岗职工工资元、第三产业就业比重、人均受教育平均年限、教育经费强度、在校学生结构、规上工业企业RD全时当量h、每百人创新企业数、电子商务交易活动企业数企业总数、机器人安装密度、森林覆盖率、环境保护支出一般财政支出、化学