matrix_last_acm_3
the first CCPC password 123
A 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 ;
}
D 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 ;
}
G 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 ;
}
H 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 ;
}
L 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的更多相关文章
随机推荐
- ace 读取excel
insert into T_BirdSystemSku(ID,Sku) select ID,SKU from OpenRowSet('Microsoft.ACE.OLEDB.12.0', 'Excel ...
- [terry笔记]Oracle10g/11g安装-redhat5.5
操作系统准备工作 其实真正的进入图形界面安装是简单的,只是前期的配置比较繁琐,如版本.空间.位置.软件包.用户.环境变量.内核参数,这里主要讨论前期配置. 10g与11g的单实例安装基本一样,主要区别 ...
- 欢迎来到vmax-tam的博客
欢迎来到vmax-tam的博客 我是一个新手程序员 以后会不断学习 把学到的东西记录下来 和大家一起分享的 谢谢大家指教
- 菜鸟学习Hibernate——一对多关系映射
Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...
- 【6.24-AppCan移动开发大会倒计时】科大讯飞来了!
6.24 AppCan移动开发者大会进入倒计时,报名通道即将关闭! 50多家移动圈服务商将出席此次大会,讯飞开放平台也将作为参展商,为参会者带去前沿的语音技术.参会者可现场体验最新连续语音识别技术,识 ...
- Android--ViewPager的无限轮播
ViewPage_RadioButton实现带小圆点的无限轮播,效果还能凑合着用. 1.在ViewPage的监听里面这样处理 @Override public void onPageSelected( ...
- Table ‘performance_schema.session_variables’ doesn’t exist
运行mysql时,提示Table ‘performance_schema.session_variables’ doesn’t exist 解决的方法是: 第一步:在管理员命令中输入: mysql_u ...
- c# Random Class usage
Random Usage sometimes, we hope to generate some random infor to manipulate our data structor. we ca ...
- wire与reg的区别?转载大神!
本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...
- svn中的图标解释
黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不 允许你提交,防止你的提交覆盖了 ...