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. iostat命令简单说说

    tps: 每秒钟发送到的I/O请求数. Blk_read /s: 每秒读取的block数 Blk_wrtn/s: 每秒写入的block数 Blk_read: 读入的block总数 Blk_wrtn: ...

  2. ajax翻页效果模仿yii框架

    ajax翻页效果,模仿yii框架. 复制代码代码如下: <!DOCTYPE html>  <html>  <head>  <title>ajax分页_w ...

  3. while循环中不支持循环使用curl

    <?php $link = mysql_connect('localhost', 'sms', 'sms'); mysql_select_db('sms', $link); mysql_quer ...

  4. PHP Startup: Unable to load dynamic library

    昨天帮一朋友配置服务器结果发现apache日志中有PHP Warning: PHP Startup: Unable to load dynamic library 提示了,然后调试数据库连接发现提示C ...

  5. 为啥 Objective-C 使用中括号来调用类方法?

    原因在这篇文章中:http://stackoverflow.com/questions/23723838/why-does-objective-c-use-square-brackets-for-me ...

  6. java clone简单学习

    最近在帮忙写单侧的时候,经常会和这几个对象类打交道,因为对java也不是很熟悉,刚好学习一下,都是很浅的学习,并没有深入的去学习哈,因为感觉也用不上. protected Object clone() ...

  7. Moses更改权重的命令变化 -d -t -

    -l  可以用: weight-l 或者lm  (不需要在前面加-)   还是用-weight-overwrite “Distortion0= 0"更保险 reording weight i ...

  8. 自己写算法---java的堆的非递归遍历

    import java.io.*; import java.util.*; public class Main { public static void main(String args[]) { S ...

  9. Python常用内建模块

    Python常用内建模块 datetime 处理日期和时间的标准库. 注意到datetime是模块,datetime模块还包含一个datetime类,通过from datetime import da ...

  10. 2天驾驭DIV+CSS (技巧篇)(转)

     这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是技巧篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” ...