19_10_26_Codeforces巴什博弈+模擬

Yet Another Crosses Problem

Yet Another Crosses Problem
思路就是計算每一行每一列的格子a所在的那一行有多少個塗過的格子,所在的那一列有多少個塗過的格子,再再後面的遍歷裏計算格子a要形成連通需要(m - row[i])(n - column[j])個塗黑的。然後注意如果格子a是白格子,那格子a在計算的時候被我們塗黑了兩次,要記得減1;
這道題不要看到數據就不敢用暴力,看仔細會發現數據其實不大;

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
vector<char> maze[50010];

int q,n,m;
int row[50005],column[50005];

int main(){
	cin >> q;
	while(q--){
		cin >> n >> m;
		cin.ignore();
		memset(maze,0,sizeof(maze));
		memset(row,0,sizeof(row));
		memset(column,0,sizeof(column));
		for(int i = 0;i < n;i++){
			for(int j = 0;j < m;j++){
				char c;	cin >> c;
				row[i] += c == '.' ? 0 : 1;
				column[j] += c == '.' ? 0 : 1;
				maze[i].push_back(c);
			}
			cin.ignore();
		}
		int ans = 0x3f3f3f3f;
		for(int i = 0;i < n;i++){
			for(int j = 0;j < m;j++){
				int sum = 0;
				sum = (m - row[i]) + (n - column[j]);
				if(maze[i][j] == '.')
					sum --;
				ans = ans > sum ? sum : ans;
//				cout << ans << " sum: " << sum << endl;
			}
		}
		cout << ans << endl;
	}
	return 0;
} 

From S To T

From S To T

回宿舍的時候發現我登不進那個網站了(丟臉)

1-2-K Game

1-2-K Game
是一道博弈論的題
博弈論之巴什博弈講得好好的博客
先講一下典型的情況:

兩個人精在搶水果,有n個水果,每次每個人能取[1,k]個水果,到最後不能拿的人氣死了,請問先手人精與後手人精誰必敗?

?當n≤k時,這時先手人精的人可以一次取走所有的水果;

?當n=k+1時,這時先手人精無論取走多少個,後手人精都能取走剩下所有的水果;

?當n=C∗(k+1)時,對於每k+1個水果,後手人精有主動權。先手人精取i個,後手人精一定能將剩下的(k+1−i)個都取走,因此後手人精必勝;

?當n=C∗(k+1)+x(0<x<m+1)時,先手人精可以先取x個,之後的局勢就回到了上一種情況,主動權移交到先手人精那。無論後手人精取多少個,先手都能取走m+1箇中剩下的,因此先手必勝。
結論:

通過上面的分析可以得出結論:當n能整除m+1時先手必敗,否則先手人精必勝。

(先看上面的纔看得懂下面的)

還是兩個人精a,b(a先出)拿水果,誰到最後沒有水果拿就輸了。
一次只允許拿1個,2個或者k個;
? 當k % 3 = 0的時候
?當n % 3 = 0 的時候,
?
?當k % 3 != 0的時候
?
?
?

(怎麼講都覺得哪裏掛怪的,等我像清楚怎麼講再來補)

#include <iostream>
using namespace std;
int n,t,k;
int main(){
	cin>>t;
	while(t--){
        cin>>n>>k;
        if(k%3){
            if(n%3)
            	cout << "Alice" << endl;
            else 
            	cout << "Bob" << endl;
        }
		else {
            n%=k+1;
            if(n==k||n%3)
				cout << "Alice" << endl;
            else 
            	cout << "Bob" << endl;
        }
	}
	return 0;
}

PlayList

PlayList
思路是這樣的:先把beauty好聽從大排到小,然後累加sum,每次都把時長的負值壓進隊列裏,隊列自動把最時長最小的排到最頂上,這樣每當選歌超出限制的時候就把最短的那首歌給刪了,記錄一下到底是把時長長的歌排進來乘以最小的那個滿意度所得結果大,還是之前那個沒把時長長的歌排進來,但是滿意度比較高的歌排進來的所得結果大。

#include<bits/stdc++.h>
using namespace std;
pair<int,int> a[300002];
long long int ans=0,sum=0;
priority_queue<int> q;
int main(){
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>a[i].second>>a[i].first;
	}
	sort(a+1,a+1+n);
	for(int i=n;i>=1;i--){
		sum+=a[i].second;
		q.push(-a[i].second);
		if(q.size()>k){
            sum+=q.top();
            q.pop();
        }
        ans=max(ans,a[i].first*sum);
	}
	cout<<ans;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章