1. 程式人生 > 其它 >NYIST-20級寒假第一次周賽-個人補題+ans。

NYIST-20級寒假第一次周賽-個人補題+ans。

技術標籤:Grown題解

1202年 1月16日工作室第一次周賽:三小時七題。
AC 3 / 7題 : A, E,G;
知識點:邏輯,BFS,並查集,素數篩,二分答案,模擬。
比賽連結 < < 點我!!

---------------------------------- 我是分割線 ----------------------------------
AC 題目:

A. CodeForces 1A
邏輯題

AC程式碼:

#include<iostream>
#include<cmath>
using namespace std;
 int main
() { double n,m,a; cin >> n >> m >> a; long long ans; long long x,y; x = n / a; y = m / a; if(x == n / a && y == m / a) ans = x * y; else if (x == n / a && y != m / a) ans = x * (y+1); else if (x != n / a && y == m / a) ans = (x + 1) * y; else if(x !=
n / a && y != m / a) ans = (x+1) * ( y+1); cout << ans; return 0; }

反思: 思維很直接,學長程式碼簡潔!

學長題解:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    long long n, m, a;
    scanf("%lld%lld%lld", &n, &m, &a);
    printf("%lld\n", (n / a + (n %
a ? 1 : 0)) * (m / a + (m % a ? 1 : 0)));//三目寫法更簡潔 // long long A, B; // A = n / a; // if (n % a > 0) // A++; // B = m / a; // if (m % a > 0) // B++; // printf("%lld\n", A * B); return 0; }

E.LightOJ 1259

知識點:素數篩

AC程式碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const long long Max = 1e7  + 1;
bool st[Max];
int prime[Max];
//bool isprime(int n)
//{
//	if(n == 1) return false;
//	if(n == 2 || n == 3) return true;
//	if(n%6!=1 && n%6!=5) return false;
//	int s = sqrt(n) ;
//	for(int i = 5 ;i < s + 1 ; i+=6)
//		if(n%i == 0 || n%(i+2) == 0)  return false;
//	return true;
//}
void isprime(long long  n)
{
	int ct = 0;
	for(int i = 2 ; i < n ; i++)
	{
		if(st[i] == 0) prime[ct++] = i;
		for(int j = 0; j < ct && i * prime[j] <= n;j++)
		{
			st[i*prime[j]] = 1; 
			if(i%prime[j]==0) break;
		}
	}
}
int main()
{
	int T,k = 1;
	cin >> T;
	int ans = 0;
	isprime(Max);
	while(T--)
	{
			
		long long  p;
		cin >> p;
		for(int i =2; i < p  / 2 + 1;i++)
		{
			if(!st[i])
			{
				long long P = p - i;
				if(!st[P] && P >=  i)
				{
					ans++;
				}
			}
		}
		printf("Case %d: %d\n",k,ans);
		ans = 0;
		k++;
	}
	
	return 0;
}

反思:要用尤拉篩;

G題。。。。

反思:

超水題 but dddd,剛開始太慌張了QAQ.

--------------------------------正經分割線-------------------------------------
補題:

B.CodeForces 1036D
知識點: 邏輯題 !!! 有關陣列處理,多看看。

#include<iostream>

using namespace std;
const int Max = 3e5 + 1;
int a[Max];
int b[Max];
int main()
{
	ios::sync_with_stdio(false);
	int n,m;
	long long s1 = 0,s2 = 0;
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
		s1 += a[i];
	}
	cin >> m;
	for(int j = 1; j <= m; j++)
	{
		cin >> b[j];
		s2 += b[j];
	}
	if(s1 != s2) cout << "-1";
	else
	{
		int ans;
		s1 = s2 = 0,ans = 0;
		int pos1 = 0,pos2 = 0;
		while(pos1 <= n || pos2 <= m)
		{
			if(s1 == s2 && s1)
			{
				ans++, pos1++ ,pos2++;
				s1 = a[pos1];
				s2 = b[pos2];
			}
			else if(s1 == s2 && !s1)
			{
				s1 += a[++pos1];
				s2 += b[++pos2];
			}
			else if(s1 < s2)
			{
				s1 += a[++pos1];
			}
			else if(s1 > s2)
			{
				s2 += b[++pos2];
			}
		}
		cout << ans;
	}
	return 0;
}

C.CodeForces 669C

知識點:模擬。

AC程式碼:

#include<iostream>

using namespace std;
const int N = 10001;
const int M = 300; 
int a[M][M];
int s1[N];
int	s2[N];
int s3[N];
int s4[N];
int j = 0;
int t,c,r,x;
int main()
{
	int n,m,p;
	cin >> n >> m >> p; 
	while(p--) // chuli;
	{
		
		cin >> t;
		if(t == 1)
		{
			cin >> c;
			j++;
			s1[j] = t;
			s2[j] = c;
		}
		else if(t == 2)
		{
			j++;
			cin >> c;
			s1[j] = t; 
			s2[j] = c;
		}
		else if(t == 3)
		{
			j++; 
			cin >> c >> r >> x;
			s1[j] = t;
			s2[j] = c;
			s3[j] = r;
			s4[j] = x;
		}
	}
	
	
	
	for(int i = j; i >= 1 ;i--)
	{
		if(s1[i] == 1)
		{
			int g;
			g = s2[i]; 
			for(int k = m ; k >= 2; k--)
				swap(a[g][k],a[g][k-1]);	
		}
		else if(s1[i] == 2)
		{
			int g;
			g = s2[i];
			for(int k = n ; k >= 2; k--)
				swap(a[k][g],a[k-1][g]);
		}
		else if(s1[i] == 3)
		{
			c = s2[i];
			r = s3[i];
			x = s4[i];
			a[c][r] = x;
		}
	}
	for(int i = 1; i <= n; i++)
	{
		for(int l = 1; l <= m; l++)
		cout << a[i][l] << " ";
		cout << endl;
		
	}
	return 0;
} 

反思: 英語能力太差 + 太篛 + 緊張 ,題都沒有讀。。。 一道模擬題,如果能看懂題,還是可以做的!

D.CodeForces 760B

知識點: 二分答案 + 貪心;

AC 程式碼 略;

反思: 二分 二分 ,現在還是有點蒙 蒙,其實二分沒什麼主要是題不理解,
沒法做。。。

F.計蒜客 A1139

知識點: BFS / 並查集

AC程式碼:

#include<bits/stdc++.h>
using namespace std;
const int Max = 1e5 + 100;
int pre[Max];
char mp[1010][1010];

void Init(int n)
{
	for(int i = 1;i <= n; i++)
		pre[i] = i;	  	
}

int find_pre(int key)
{
	if(key == pre[key])
		return key;
	return pre[key] = find_pre(pre[key]);
}

void unite(int x, int y)
{
	int tx = find_pre(x);
	int ty = find_pre(y);
	if(tx != ty)
		pre[tx] = ty;
}

int main()
{
	int n,m; 
	scanf("%d %d",&n,&m);
	Init(n + m + 2);
	for(int i = 1; i<= n; i++) scanf("%s",mp[i] + 1);
	
	
	// 並查集;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			if(mp[i][j] == '1')
			{
				unite(i,j + n);
			}	
		}
	
	int res = 0; 
	int jd[Max] = {0};
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			if(mp[i][j] == '1')
			{
				int t = find_pre(i);
				if(!jd[t]) res++, jd[t] = 1;
				
				t = find_pre(j + n);
				if(!jd[t]) res++, jd[t] = 1;
			}
		}
		printf("%d",res); 

	return 0;
}

反思:這次周賽最大收穫學習到 並查集 和 使用尤拉篩;

總結

							道阻且長!
							繼續加油!
											----Bzdhxs