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
每週計劃:
可能這一週要補上實驗報告和之前落下的專業課學習
不會把精力放到這邊,撿漏做題把。