19_11_22:CF集訓

B. Square Filling

a矩陣內若有4個全爲1的2 * 2 小方塊,且b矩陣相應位置有不爲1的小方塊,就記錄這個位置,然後比較a,b矩陣相同的位置的元素。這個思路說不出哪裏對,但是也不能證僞。

#include <iostream>
using namespace std;
int n,m;
const int MAXN = 55;
int a[MAXN][MAXN],b[MAXN][MAXN];
bool isnot = false;
int ans[55 * 55][2];int cnt = 0;
int main(){
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		a[i][0] = a[i][m + 1] = 1;
		b[i][0] = b[i][m + 1] = 1;
		for(int j = 1;j <= m;j++){
			cin >> a[i][j];
		}
	}
	for(int i = 0;i <= m + 1;i++){
		a[0][i] = a[n+1][i] = b[0][i] = b[n+1][i] = 1;
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			if(i < n && j < m){
				if(a[i][j]+a[i][j+1]+a[i+1][j]+a[i+1][j+1] == 4){ //a矩陣小方框內都爲1 
					if(b[i][j]+b[i+1][j]+b[i][j+1]+b[i+1][j+1] < 4){ //b矩陣小方框內有爲零的元素 
						b[i][j]=b[i+1][j]=b[i][j+1]=b[i+1][j+1] = 1;
						ans[cnt][0] = i;//加入答案 
						ans[cnt++][1] = j;
					}
				}
			}
			if(a[i][j] != b[i][j]){	//若不相等,則直接退出 
				isnot = true;
				break;
			}
		}
	}
	if(isnot)
		cout << -1;
	else if(cnt == 0)
		cout << 0 << endl;
	else{
		cout << cnt << endl;
		for(int i = 0;i < cnt;i++){
			cout << ans[i][0] <<" " << ans[i][1] << endl;
		}
	}
	return 0;
}

A. There Are Two Types Of Burgers

簽到水題:

#include <iostream>
using namespace std;

int t,b,p,f;
int h,c;

int main(){
	cin >> t;
	while(t--){
		cin >> b >> p >> f;
		cin >> h >> c;
		b = b / 2;
		if(h > c){
			if(b >= p)
				cout << p * h + min(b - p,f) * c << endl; 
			else
				cout << b * h << endl;
		}else{
			if(b >= f){
				cout << f * c + min(b - f,p) * h << endl; 
			}else
				cout << b * c << endl;
		}
	}
	return 0;
}

C. Gas Pipeline

隊長的代碼,我累了。

#include <iostream>
#include <vector>
#define ll long long
using namespace std;
const ll mod=1e9+7;
const int N=5e5+10;
ll n,m,k,t,a,b,ans,T;
string s;
int main() {
    cin>>T;
    while(T--){
        vector<int>v;
        cin>>n>>a>>b>>s;
        for(int i=0;i<n;i++)if(s[i]=='1')v.push_back(i);
        if(v.size()>0){
            ans=v[0]*b+(n-v[v.size()-1]-1)*b+(n+2)*a+(v[v.size()-1]-v[0]+2)*2*b;
        }else {
            cout<<(n+1)*b+n*a<<endl;continue;
        }
        for(int i=1;i<v.size();i++){
            t=v[i]-v[i-1];
            if(t<=1)continue;
            else{
                if(t*2*b+(t-1)*a>(t+2)*b+(t+1)*a){
                    ans-=(b*t-2*b-2*a);
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

A. Telephone Number

簽到水題

#include <iostream>
#include <string>
using namespace std;
int t,n,n1,i;
string tel;

int main(){
	cin >> t;
	while(t--){
		cin >> n;
		cin >> tel;
		n1 = (n - 11) * 2;
		i = 0;
		for(i = 0;i < n1;i++){
			if(tel[i] == '8'){
				break;
			}
		}
		if(i > n1/2 ||(n == 11 && tel[0] != '8')){
			cout << "NO" << endl;
		}
		else
			cout << "YES" << endl;
	}
	return 0;
} 

C. News Distribution

並查集

#include <iostream>
const int MAXN = 5e5 + 5;
using namespace std;
int f[MAXN],ans[MAXN];
int n,m,num,fa,son;

int find(int x)	 
{
	if(f[x] == x)
		return x;
	return f[x] = find(f[x]);
}

int main(){
	cin >> n >> m;
	for(int i = 0;i <= n;i++){
		f[i] = i;ans[i] = 1;
	}
	for(int i = 0;i < m;i++){
		cin >> num;
		if(num == 0)
			continue;
		cin >> fa;
		for(int j = 1;j < num;j++){
			cin >> son;
			int a = find(fa);//找最頂層節點
			int b = find(son);
			if(a != b){//若不相同,則讓兒子的最頂層節點的上層節點變成父親的最頂層節點,只要是合在一棵樹就行了
				f[b] = a;
				ans[a] += ans[b];//父親的最頂層節點加上兒子的最頂層節點的樹的節點數
			}
		}
	}
	for(int i = 1;i <= n;i++){
		cout << ans[find(i)] << " ";
	} cout << endl;
	return 0;
}


B. Lost Numbers

每週計劃:

可能這一週要補上實驗報告和之前落下的專業課學習
不會把精力放到這邊,撿漏做題把。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章