1. 程式人生 > >CSU 1813: 蓋房子 1815: Enterprising Escape 1817: Bones’s Battery 1818: Crusher’s Code

CSU 1813: 蓋房子 1815: Enterprising Escape 1817: Bones’s Battery 1818: Crusher’s Code

#include<set>
#include<map>
#include<ctime>
#include<cmath>
#include<stack>
#include<queue>
#include<bitset>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define
rep(i,j,k) for (int i = j; i <= k; i++) #define per(i,j,k) for (int i = j; i >= k; i--)
#define loop(i,j,k) for (int i = j;i != -1; i = k[i]) #define lson x << 1, l, mid #define rson x << 1 | 1, mid + 1, r #define ff first #define ss second #define mp(i,j) make_pair(i,j) #define pb push_back #define pii pair<int,int>
#define in(x) scanf("%d", &x); using namespace std; typedef long long LL; const int low(int x) { return x&-x; } const double eps = 1e-9; const int INF = 0x7FFFFFFF; const int mod = 1e9 + 7; const int N = 1e3 + 10; char s[N]; int n, m; int c[N][N], a[N][N]; LL ls[N][N], lx[N][N], rs[N][N], rx[N][N]; void
GetFour()
{ memset(c, 0, sizeof(c)); rep(i, 1, n) { rep(j, 1, m) { if (a[i][j] || c[i][j]) continue; while (c[i][j] <= n - i && !a[i + c[i][j]][j]) c[i][j]++; rep(k, 2, c[i][j]) c[i + k - 1][j] = c[i][j] - k + 1; } int sum = 0; stack<pii> p; per(j, m, 1) { pii now = mp(c[i][j], 1); while (!p.empty() && p.top().ff > now.ff) { pii q = p.top(); sum -= q.ff * q.ss; now.ss += q.ss; p.pop(); } sum += now.ff * now.ss; p.push(now); ls[i][j] = sum; } sum = 0; while (!p.empty()) p.pop(); rep(j, 1, m) { pii now = mp(c[i][j], 1); while (!p.empty() && p.top().ff > now.ff) { pii q = p.top(); sum -= q.ff * q.ss; now.ss += q.ss; p.pop(); } sum += now.ff * now.ss; p.push(now); rs[i][j] = sum; } } memset(c, 0, sizeof(c)); per(i, n, 1) { rep(j, 1, m) { if (a[i][j] || c[i][j]) continue; while (c[i][j] < i && !a[i - c[i][j]][j]) c[i][j]++; rep(k, 2, c[i][j]) c[i - k + 1][j] = c[i][j] - k + 1; } int sum = 0; stack<pii> p; per(j, m, 1) { pii now = mp(c[i][j], 1); while (!p.empty() && p.top().ff > now.ff) { pii q = p.top(); sum -= q.ff * q.ss; now.ss += q.ss; p.pop(); } sum += now.ff * now.ss; p.push(now); lx[i][j] = sum; } sum = 0; while (!p.empty()) p.pop(); rep(j, 1, m) { pii now = mp(c[i][j], 1); while (!p.empty() && p.top().ff > now.ff) { pii q = p.top(); sum -= q.ff * q.ss; now.ss += q.ss; p.pop(); } sum += now.ff * now.ss; p.push(now); rx[i][j] = sum; } } } int main() { while (scanf("%d%d", &n, &m) != EOF) { rep(i, 0, n + 1) rep(j, 0, m + 1) ls[i][j] = rs[i][j] = 0; rep(i, 1, n) { scanf("%s", s + 1); rep(j, 1, m) a[i][j] = s[j] - '0'; } GetFour(); LL L = 0, R = 0, ans = 0; rep(i, 1, n) { rep(j, 1, m) (R += ls[i][j]) %= mod; (ans += L * R) %= mod; R = 0; rep(j, 1, m) (L += rx[i][j]) %= mod; } L = R = 0; rep(j, 1, m) { rep(i, 1, n) (R += ls[i][j]) %= mod; (ans += L * R) %= mod; R = 0; rep(i, 1, n) (L += rx[i][j]) %= mod; } rep(i, 1, n) { rep(j, 1, m) { rx[i][j] += rx[i - 1][j] + rx[i][j - 1] - rx[i - 1][j - 1]; (ans -= rx[i][j] * ls[i + 1][j + 1]) %= mod; } per(j, m, 1) { lx[i][j] += lx[i - 1][j] + lx[i][j + 1] - lx[i - 1][j + 1]; (ans -= lx[i][j] * rs[i + 1][j - 1]) %= mod; } } printf("%lld\n", (ans + mod) % mod); } return 0; }
#include <iostream>
#include <cstring>
#include <stack>
#include <cstdio>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
const double eps=1e-8;
const double PI=acos(-1.0);
using namespace std;

struct st{
    int x;
    int y;
    int step;
    friend bool operator <(st a,st b){
    return a.step>b.step;}
}node;
char a[1005][1005];
int v[1005][1005];
int d[][2]={{1,0},{0,1},{0,-1},{-1,0}};
int k,n,m,num;
 map<char,int> s;
int bfs(int x,int y)
{
    priority_queue<st>q;
    node.x=x;
    node.y=y;
    node.step=0;
    q.push(node);
    v[x][y]=1;
    while(!q.empty())
    {
        st tem=q.top();
        //cout<<tem.x<<" "<<tem.y<<endl;
        q.pop();
        st tp;
         if(tem.x>=m-1||tem.y>=n-1||tem.x<=0||tem.y<=0)
            {

                return tem.step;//cout<<"t:"<<e<<endl;

            }
        for(int i=0; i<4; i++)
        {
            tp.x=tem.x+d[i][0];
            tp.y=tem.y+d[i][1];

            if(v[tp.x][tp.y]) continue;

            tp.step=tem.step+s[a[tp.x][tp.y]];
            q.push(tp);
            v[tp.x][tp.y]=1;
            //cout<<tp<<endl;
        }
    }
    return -1;
}
int main()
{
    int t;

    scanf("%d",&t);
    while(t--){
            memset(v,0,sizeof(v));
        char c;
        scanf("%d%d%d",&k,&n,&m);
        getchar();
        for(int i=0;i<k;i++){
            scanf("%c %d",&c,&num);
            getchar();
            s[c]=num;
            }
            int x,y;
        for(int i=0;i<m;i++)
            scanf("%s",a[i]);
            for(int i=0;i<m;i++)
                for(int j=0;j<n;j++)
                if(a[i][j]=='E'){
                    x=i;y=j;
                }
           printf("%d\n",bfs(x,y));

    }
    return 0;
}
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<vector>
#include<math.h>
#include<map>
#include<queue> 
#include<algorithm>

using namespace std;

const double pi=acos(-1.0);
const int inf = 0x3f3f3f3f;
const int maxn=100005;
const double eps=1e-8; 
const long long INF=10000000000;

int n,k,m;
long long dis[105][105], red[105][105]; 

void init(long long dis[][105]){//初始化陣列 
    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            if (i==j)dis[i][j]=0;
            else dis[i][j]=INF;
        }
    }
}

void floyd(long long dis[][105]){//folyd 求各源點間的最短距離 
    for(int t=0;t<n;t++){
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                dis[i][j]=min(dis[i][j],dis[i][t]+dis[t][j]);
            }
        }
    }
}

int main()
{
    int t;
    scanf ("%d",&t);
    while (t--){
        scanf ("%d%d%d",&n,&k,&m);
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                if (i==j)dis[i][j]=0;
                else dis[i][j]=INF;
            }
        }
        int u,v,val;
        for (int i=0;i<m;i++){
            scanf ("%d%d%d",&u,&v,&val);
            dis[u][v]=dis[v][u]=val;
        }
        floyd(dis);
        long long lo=1,hi=INF;
        long long mid;
        long long ans=INF;
        while (lo<=hi){//二分答案 
            mid=(lo+hi)/2;
            init(red);
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    red[i][j]= dis[i][j]<=mid?1:INF;//如果小於mid說明i->j只需要充一次電 
                }
            }
            floyd(red);//跑floyd 
            long long d=0;
            for (int i=0;i<n;i++){
                for (int j=0;j<n;j++){
                    if (red[i][j]>d)d=red[i][j];//求出充電次數最多的一條路徑 
                }
            }
            if (d<=k){//如果次數小於k說明此時的距離符合 
                ans=mid;//儲存 
                hi=mid-1;
            }
            else lo=mid+1;
        }
        printf ("%lld\n",ans);//輸出 
    }
    return 0;
 } 
#include<iostream>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;
int n;
int A[10];
void init(){
	int B[10], v[105], sz = 0;
	memcpy(B, A, sizeof(A));
	memset(v, -1, sizeof(v));
	sort(B, B + n);
	for (int i = 0; i<n; i++)
	if (v[B[i]] == -1) v[B[i]] = sz++;
	for (int i = 0; i<n; i++) {
		A[i] = v[A[i]];
	}
}

int get_sta(int A[]){
	int ret = 0;
	for (int i = 0; i<n; i++) ret = ret * 8 + A[i];
	return ret;
}

void get_arr(int S, int A[]){
	for (int i = n - 1; i >= 0; i--){
		A[i] = S % 8;
		S /= 8;
	}
}

const int MX = 1e5 + 5;
map<int, int>vis;
int sz, S[MX];
void bfs(int s){
	vis.clear();
	queue<int>q;
	q.push(s);
	vis[s] = 1;
	while (!q.empty()){
		int u = q.front(); q.pop();
		get_arr(u, A);
		for (int i = 0; i<n; i++)
		for (int j = i + 1; j<n; j++)
		if (A[i]>A[j]){
			swap(A[i], A[j]);
			int SS = get_sta(A);
			if (vis[SS] == 0){
				q.push(SS);
				vis[SS] = 1;
			}
			swap(A[i], A[j]);
		}
	}
	sz = 0;
	for (map<int, int>::iterator it = vis.begin(); it != vis.end(); it++) {
		S[sz] = it->first;
		it->second = sz++;
	}
}

double dp[MX];

//遞推寫法
double DP1(){
	memset(dp, 0, sizeof(dp));
	for (int k = 0; k<sz; k++){
		int success = 0;
		int sta = S[k];
		get_arr(sta, A);
		for (int i = 0; i<n; i++)
		for (int j = 0; j<n; j++){
			int l = min(i, j), r = max(i, j);
			if (A[l]>A[r]){
				swap(A[l], A[r]);
				int SS = get_sta(A);
				success++;
				dp[k] += dp[vis[SS]] / (n*n);
				swap(A[l], A[r]);
			}
		}
		if (success>0) dp[k] = (dp[k] + 1)*n*n / success;
	}
	return dp[sz - 1];
}

double DP2(){
	memset(dp, 0, sizeof(dp));
	for (int k = 0; k<sz; k++){
		int success = 0;
		int sta = S[k];
		get_arr(sta, A);
		for (int l = 0; l<n - 1; l++){
			int r = l + 1;
			if (A[l]>A[r]){
				swap(A[l], A[r]);
				int SS = get_sta(A);
				success++;
				dp[k] += dp[vis[SS]] / (n - 1);
				swap(A[l], A[r]);
			}
		}
		if (success>0) dp[k] = (dp[k] + 1)*(n - 1) / success;
	}
	return dp[sz - 1];
}

//記憶化搜尋寫法
double DP1(int u){
	if (u == 0) return dp[u] = 0;
	if (dp[u] >= 0) return dp[u];
	int sta = S[u];
	get_arr(sta, A);
	int success = 0;
	dp[u] = 0;
	for (int i = 0; i<n; i++){
		for (int j = 0; j<n; j++){
			int l = min(i, j), r = max(i, j);
			if (A[l]>A[r]){
				swap(A[l], A[r]);
				int SS = get_sta(A);
				success++;
				dp[u] += DP1(vis[SS]) / (n*n);
				swap(A[l], A[r]);
			}
		}
	}
	if (success>0) dp[u] = (dp[u] + 1)*n*n / success;
	return dp[u];
}

double DP2(int u){
	if (u == 0) return dp[u] = 0;
	if (dp[u] >= 0) return dp[u];
	int sta = S[u];
	get_arr(sta, A);
	int success = 0;
	dp[u] = 0;
	for (int i = 0; i<n - 1; i++){
		int l = i, r = i + 1;
		if (A[l]>A[r]){
			swap(A[l], A[r]);
			int SS = get_sta(A);
			success++;
			dp[u] += DP2(vis[SS]) / (n - 1);
			swap(A[l], A[r]);
		}
	}
	if (success>0) dp[u] = (dp[u] + 1)*(n - 1) / success;
	return dp[u];
}

int main(){
	int T;
	scanf("%d", &T);
	while (T--){
		scanf("%d", &n);
		for (int i = 0; i<n; i++) scanf("%d", &A[i]);
		init();
		int init_sta = get_sta(A);
		bfs(init_sta);

		for (int i = 0; i<sz; i++) dp[i] = 0;
		double ans1 = DP1();
		for (int i = 0; i<sz; i++) dp[i] = 0;
		double ans2 = DP2();

		printf("Monty %.6f Carlos %.6f\n", ans1, ans2);
	}
	return 0;
}

相關推薦

CSU 1813: 房子 1815: Enterprising Escape 1817: Boness Battery 1818: Crushers Code

#include<set> #include<map> #include<ctime> #include<cmath> #include<stack> #include<queue> #include&l

ECNU 2018 10月月賽 E 房子 (bitset + 倍增)

get bits continue fir ble 麻煩 mes pri http 題目鏈接 ECNU Monthly 2018.10 Problem E 從開場寫到結束…… 顯然要把三角形分成上下兩部分。 把每一部分分成三部分,以上部分

房子1057

描述 永恆の靈魂最近得到了面積為n*m的一大塊土地(高興ING^_^),他想在這塊土地上建造一所房子,這個房子必須是正方形的。 但是,這塊土地並非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。這些瑕疵十分噁心,以至於根本不能在上面蓋一磚一瓦。 他希望找到一塊最大的正

【題解】房子

efi code 最大 輸出格式 頂點 ostream 十分 如果 space 題目描述 Farmer John最近得到了面積為m×n的一大塊土地,他想在這塊土地上建造一所房子,這個房子必須是正方形的。但是,這塊土地並非十全十美,上面有很多不

CSU 1908: The Big Escape 1909: Perfect Chocolate 1911: Card Game 1912: One Boring Problem

#include <iostream> #include<queue> #include<vector> #include<algorithm> #inc

CSU-1908 The Big Escape

mem oda ems 多個 inpu 通過 test case 給定 amp CSU-1908 The Big Escape Description There is a tree-like prison. Expect the root node, each node

復選框式查詢 例題租房子

bmi 全選 this [0 tel lod cell .org nal <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/

CSU - 1556 Jerry&#39;s trouble(高速冪取模)

click ostream algo printf 高速 ron main 取模 bit 【題目鏈接】:click here 【題目大意】:計算x1^m+x2^m+..xn^m(1<=x1<=n)( 1 <= n < 1 000 000, 1 &

簡明區分escape、encodeURI和encodeURIComponent

aso 字符串 () 問題 最好 %x 空格 con %u 一、前言 講這3個方法區別的文章太多了,但是大部分寫的都很繞。本文試圖從實踐角度去講這3個方法。 二、escape和它們不是同一類 簡單來說,escape是對字符串(string)進行編碼(而另外兩種是對URL

HDU1813:Escape from Tetris(IDA)

memset onos 。。 字符 每一個 題目 push pri [1] Problem Description 因為整日整夜地對著這個棋盤,Lele最終走火入魔。每天一睡覺。他就會夢到自己會被人被扔進一個棋盤中,一直找不到出路,然後從夢中驚醒。久而久之,Lele被搞

【搜索】 HDU 3533 Escape BFS 預處理

cap 擁有 ace deque i++ const tdi code -m 要從0,0 點 跑到m,n點 路上會有k個堡壘發射子彈。有子彈的地方不能走,子彈打到別的堡壘就會消失,或者一直飛出邊界(人不能經過堡壘 能夠上下左右或者站著不動 每步都須要消耗能量 一共同

(樹形dp+LCA倍增法)CSU 1915 - John and his farm

const http 題解 def iostream clu algo farm john 題意: 有一個棵樹,現在讓你找兩個點連接起來,這樣必然成為一個環,現在要求這些環長度的期望,也就是平均值。 分析: 第一次做LCA題,做多校的時候,瞎幾把找了模板敲,敲了個八九

csu-acm 1503: 點到圓弧的距離

tdi per 註釋 -s 最短距離 txt href amp code 1503: 點到圓弧的距離 分析: 先判斷點和圓心的連線是否在圓弧範圍內,如果在,最短距離即到圓心的距離減去半徑的絕對值;反之,為到端點的最短距離。 具體看註釋 #include <

亞馬遜CEO貝佐斯財富或超比爾

比爾蓋茨 福布斯 亞馬遜公司 財富 凈資產 TechWeb報道根據福布斯的消息,亞馬遜公司估價不斷創下歷史新高,這也使得亞馬遜公司CEO貝佐斯的凈資產不斷提升。截至周五股市收盤,貝佐斯凈資產增長28億美元至847億美元,創下歷史新高。同時他也成為了財富增長最快的億萬富翁,距離比爾蓋茨的差距

(線段樹區間賦值)CSU 1942 - Sort String

== print 字母 can right += 小寫 csu 一模一樣 題意: 一個串(串中只有26個小寫字母),選一個區間進行排序,進行100000次,輸出最後的串。 分析: 比賽的時候很懵逼,感覺這題跟之前的額大崩龍有點像,但是沒多想,也怪自己太菜了。

強STOLL M1 v3.7.014 for WinXP 1CD+Grapyuoft Crchicbd 2017

STOLL M1 v3.7.014 for WinXP 1CD Grapyuoft Crchicbd 2017 nPower.PowerSurfacing.Re v2.4-4.1 for SolidWorks 2012-2017 Win64 6CD SolidWorks插件 Powe

HDU 5389 Zero Escape (MUT#8 dp優化)

etc memset rgb color 兩個 || 答案 一位數 ack 【題目鏈接】:pid=5389">click here~~ 【題目大意】: 題意: 給出n個人的id,有兩個門,每一個門有一個標號,我們記作a和b,如今我們要將n個人分成兩組,進入

Escape加解密Java版

java[java] view plain copy /** * 中文加密 * Created by geo on 2017/7/4. */ public class EscapeUtils { /** * Escape編碼 * @p

hdu 3605 Escape 二分圖的多重匹配(匈牙利算法)

aid gree to do als 技術 contain pop 解決 limit 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS

張天愛報紙睡機場 為新片連續工作3天無休

小時 細心 class 系列 -m 英雄 素質 騰訊 article 《父子雄兵》張天愛大鵬劇照 張天愛航班延誤滯留睡機場 騰訊娛樂訊 7月16日淩晨,剛剛結束《父子雄兵》路演的張天愛由於天氣原因滯留成都機場一夜,一夜未休息的狀態下,她仍然按原定計劃工作