the first CCPC   password 123

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97380#problem/A

题意:给两个2*2的矩阵,问是否完全相同,其中一个矩阵可以旋转任意次90度。

解法:转4次都测一下是否相同。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
int a[M];
int b[M];
char str[][]={"POSSIBLE","IMPOSSIBLE"};
bool judge(int d){
for(int i=;i<;i++){
if(a[i]!=b[(i+d)%]) return false;
}
return true;
}
int solve(){
for(int i=;i<;i++){
if(judge(i)) return ;
}
return ;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d%d%d%d",&a[],&a[],&a[],&a[]);
scanf("%d%d%d%d",&b[],&b[],&b[],&b[]);
printf("Case #%d: %s\n",cas++,str[solve()]);
}
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97380#problem/D

题意:将n个长度为a,价值为v的木棍放在长度为L的桌面上,其中两端的木棍只要保证中心在桌面上就行,问能得到的最大价值。

解法:就是01背包问题,只是其中有两个物体的花费可以除以2.下面用了一种非常不优美,但是比较好理解的dp,卡过。把所有长度*2避免浮点数。然后dp【i】【j】【k】表示前i个物品花费了j的长度有k个是减半的最大价值。i需要滚动。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e3+;
int a[M];
int v[M];
int n,L;
LL dp[][M<<][];
void init(int now){
for(int i=;i<=L;i++){
for(int j=;j<;j++){
dp[now][i][j]=-;
}
}
}
void Copy(int now,int pre){
for(int i=;i<=L;i++){
for(int j=;j<;j++){
dp[now][i][j]=dp[pre][i][j];
}
}
}
void update(int now,int i,int j,LL value){
dp[now][i][j]=max(dp[now][i][j],value);
}
LL solve(){
L<<=;
for(int i=;i<=n;i++){
a[i]<<=;
}
init();
dp[][][]=;
int now=;
int pre=;
for(int i=;i<=n;i++){
now^=;
pre^=;
Copy(now,pre);
for(int j=;j<=L;j++){
for(int k=;k<;k++){
LL &ans=dp[pre][j][k];
if(ans==-) continue;
if(j+a[i]<=L){
update(now,j+a[i],k,ans+v[i]);
}
if(k<&&j+(a[i]>>)<=L){
update(now,j+(a[i]>>),k+,ans+v[i]);
}
}
}
}
LL res=;
for(int i=;i<=n;i++){
res=max(res,0LL+v[i]);
}
for(int i=;i<=L;i++){
for(int j=;j<;j++){
res=max(res,dp[now][i][j]);
}
}
return res;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d%d",&n,&L);
for(int i=;i<=n;i++){
scanf("%d%d",&a[i],&v[i]);
}
printf("Case #%d: %lld\n",cas++,solve());
}
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97380#problem/G

题意:给一盘围棋,XO分别是黑白棋,点是空的,问再放一个X能否杀掉一部分o,能杀就是o的连通块边缘没有空。

解法1:dfs出o的连通块,统计与之相邻的空格有几个,如果只有一个就可以杀。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
char a[M][M];
char str[][]={"Can kill in one move!!!","Can not kill in one move!!!"};
bool vis[M][M];
bool sum[M][M];
int dx[]={,,,-};
int dy[]={,-,,};
void init(bool v[M][M]){
for(int i=;i<;i++){
for(int j=;j<;j++){
v[i][j]=false;
}
}
}
bool inside(int x,int y){
return x>=&&x<&&y>=&&y<;
}
void dfs(int x,int y){
vis[x][y]=true;
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(!inside(tx,ty)) continue;
if(vis[tx][ty]) continue;
if(a[tx][ty]=='x') continue;
if(a[tx][ty]=='.'){
sum[tx][ty]=true;
continue;
}
dfs(tx,ty);
}
}
bool can_kill(int sx,int sy){
init(sum);
dfs(sx,sy);
int res=;
for(int i=;i<;i++){
for(int j=;j<;j++){
if(sum[i][j]){
res++;
if(res>) return false;
}
}
}
return true;
}
int solve(){
init(vis);
for(int i=;i<;i++){
for(int j=;j<;j++){
if(vis[i][j]) continue;
if(a[i][j]!='o') continue;
if(can_kill(i,j)) return ;
}
}
return ;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
for(int i=;i<;i++){
scanf("%s",a[i]);
}
printf("Case #%d: %s\n",cas++,str[solve()]);
}
}
return ;
}

解法2:bfs出连通块,思路同上。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
char a[M][M];
char str[][]={"Can kill in one move!!!","Can not kill in one move!!!"};
bool vis[M][M];
bool sum[M][M];
int dx[]={,,,-};
int dy[]={,-,,};
struct Q{
int x,y;
}now,pre;
queue<Q> q;
void init(bool v[M][M]){
for(int i=;i<;i++){
for(int j=;j<;j++){
v[i][j]=false;
}
}
}
bool inside(int x,int y){
return x>=&&x<&&y>=&&y<;
}
void bfs(int x,int y){
vis[x][y]=true;
now.x=x;
now.y=y;
while(!q.empty()) q.pop();
q.push(now);
while(!q.empty()){
pre=q.front();
q.pop();
for(int i=;i<;i++){
int tx=pre.x+dx[i];
int ty=pre.y+dy[i];
if(!inside(tx,ty)) continue;
if(vis[tx][ty]) continue;
if(a[tx][ty]=='x') continue;
if(a[tx][ty]=='.'){
sum[tx][ty]=true;
continue;
}
vis[tx][ty]=true;
now.x=tx;
now.y=ty;
q.push(now);
}
}
}
bool can_kill(int sx,int sy){
init(sum);
bfs(sx,sy);
int res=;
for(int i=;i<;i++){
for(int j=;j<;j++){
if(sum[i][j]){
res++;
if(res>) return false;
}
}
}
return true;
}
int solve(){
init(vis);
for(int i=;i<;i++){
for(int j=;j<;j++){
if(vis[i][j]) continue;
if(a[i][j]!='o') continue;
if(can_kill(i,j)) return ;
}
}
return ;
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
for(int i=;i<;i++){
scanf("%s",a[i]);
}
printf("Case #%d: %s\n",cas++,str[solve()]);
}
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97380#problem/H

题意:给出4*4的矩阵,数字为1到4,*为未确定,给*赋值1到4,使得每行每列,四个角的2*2内都没有相同元素,保证唯一解。

解法1:把每一个位置可能的情况都存下set,每次出现只剩一个就说明该位置确定,然后将其所在行列块都删去这个数,直至推出答案。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
char a[M][M];
int b[M][M];
int dx[]={,,,};
int dy[]={,,,};
set<int> s[M][M];
void init(){
for(int i=;i<;i++){
for(int j=;j<;j++){
s[i][j].clear();
if(a[i][j]=='*'){
for(int k=;k<=;k++){
s[i][j].insert(k);
}
}
else{
s[i][j].insert(a[i][j]-'');
}
}
}
}
void Erase(int x,int y,int value){
for(int i=;i<;i++){
s[i][y].erase(value);
s[x][i].erase(value);
}
if(x&) x--;
if(y&) y--;
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
s[tx][ty].erase(value);
}
}
void solve(){
init();
bool flag=true;
while(flag){
flag=false;
for(int i=;i<;i++){
for(int j=;j<;j++){
if(s[i][j].size()==){
flag=true;
b[i][j]=*s[i][j].begin();
Erase(i,j,b[i][j]);
}
}
}
}
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
for(int i=;i<;i++){
scanf("%s",a[i]);
}
solve();
printf("Case #%d:\n",cas++);
for(int i=;i<;i++){
for(int j=;j<;j++){
printf("%d",b[i][j]);
}
puts("");
}
}
}
return ;
}

解法2:dfs每一个位置的取值,暴力所有情况。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e2+;
char a[M][M];
int b[M][M];
int dx[]={,,,};
int dy[]={,,,};
void init(){
for(int i=;i<;i++){
for(int j=;j<;j++){
b[i][j]=-;
if(a[i][j]!='*'){
b[i][j]=a[i][j]-'';
}
}
}
}
bool same(int x,int y,int value){
for(int i=;i<;i++){
if(b[x][i]==value) return true;
if(b[i][y]==value) return true;
}
if(x&) x--;
if(y&) y--;
for(int i=;i<;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(b[tx][ty]==value) return true;
}
return false;
}
bool dfs(int x,int y){
if(x==) return true;
if(y==) return dfs(x+,);
if(b[x][y]!=-) return dfs(x,y+);
for(int i=;i<=;i++){
if(same(x,y,i)) continue;
b[x][y]=i;
if(dfs(x,y+)) return true;
b[x][y]=-;
}
return false;
}
void solve(){
init();
dfs(,);
}
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
for(int i=;i<;i++){
scanf("%s",a[i]);
}
solve();
printf("Case #%d:\n",cas++);
for(int i=;i<;i++){
for(int j=;j<;j++){
printf("%d",b[i][j]);
}
puts("");
}
}
}
return ;
}

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=97380#problem/L

题意:给n种字母,问组成最短的回文串的长度。

解法:n*2-1。

 //#define debug
//#define txtout
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<ctime>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double eps=1e-;
const double pi=acos(-1.0);
const int inf=0x3f3f3f3f;
const int M=1e5+;
int a[M];
int main(){
#ifdef txtout
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int t,n;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d",&n);
printf("Case #%d: %d\n",cas++,n*-);
}
}
return ;
}

end

matrix_last_acm_3的更多相关文章

随机推荐

  1. phpcms后台部分修改

    1.后台登陆前提示信息取消及成功后提示信息取消.    (1)后台登陆前提示信息取消               phpcms\modules\admin\classes\admin.class.ph ...

  2. Windos中无法删除桌面IE图标的解决方法

    解决方法其实并不难,打开注册表,转到如下图的位置,详细地址在图片最下面: 需要注意的是,你需要在NameSpace中逐个查看各个项目的数据值,显示为数据值为Internet Explorer的项目即为 ...

  3. ASP.NET MVC5学习笔记之Controller执行ControllerDescriptor和ActionDescriptor

    一. ControllerDescriptor说明 ControllerDescriptor是一个抽象类,它定义的接口代码如下: public abstract class ControllerDes ...

  4. delphi启动 EditLineEnds.ttr 被占用问题

    碰到这个问题我也是无语了,每次关掉Delphi后就不能打开了,折腾了半天,网上的方法也没有搞定.最后,找到这个链接(网页如下所示),下载里面的东西就搞定了.打不开的可以向我要.895569369@qq ...

  5. Linux平台下:块设备、裸设备、ASMlib、Udev相关关系

    对磁盘设备(裸分区)的访问方式分为两种:1.字符方式访问(裸设备):2.块方式访问 Solaris平台 : 在Solaris平台下,系统同时提供对磁盘设备的字符.块方式访问.每个磁盘有两个设备文件名: ...

  6. openstack的第二天

    今天,在公司测试了还是网络有问题. 但是用了rdo还是成功了~明天就再试试怎么开放端口进来.

  7. 在mac上安装pydev for eclipse时,在eclipse的Preferences中无法显示出来的解决方法

    参考http://pydev.org/manual_101_install.html 中的说明,该插件依赖java7,在我安装eclipse之前并没有安装jdk,打开eclipse之后,自动安装了一个 ...

  8. “猜你喜欢”是怎么猜中你心思的?

    文/Joseph A. Konstan & John Riedl)如今,到网上购物的人已经习惯了收到系统为他们做出的个性化推荐.Netflix 会推荐你可能会喜欢看的视频.TiVo 会自动把节 ...

  9. core java 7 exception

    MODULE 7 Exceptions---------------------------- 程序正常执行过程中遇到的意外情况 引发异常的因素: 1)程序本身的内在因素 2)外部因素引发的,程序无须 ...

  10. Swift function how to return nil

    这两天在学习Stanford出品的iOS7的课程,这个课程去年也看过,但是看到第3课就不行了,满篇的OC,把人都搞晕了.这段时间因为要写个iOS的App,正好赶上了Swift问世,所以趁着这股劲继续学 ...