開學第四測
開學第四測(——qbxt zhw)
T1 (期望得分:100;實際得分:100)
消失的數字(number)
Time Limit:1000ms Memory Limit:128MB
題目描述
rsy擁有n個數,這n個數分別是a1,a2,…,an。
後來出現了一個熊孩子zhw,用橡皮擦去了其中若幹個數字,並且打亂了剩下的數字。rsy趕到現場後只剩下了m個數字b1,b2,…,bm,她想知道哪些數字被擦去了。
現在你需要告訴rsy被擦去的n-m個數是什麽。
輸入格式(number.in)
第一行一個數n,第二行n個數ai,表示一開始的數字。
第三行一個數m,第四行m個數bi,表示被擦去後的數字。
輸出格式(number.out)
一行n-m個數,從小到大輸出所有被擦去的數字。
輸入樣例
5
1 3 5 7 8
3
3 5 8
輸出樣例
1 7
數據範圍
對於30%的數據n<=1000,ai與bi都是有序的。
對於60%的數據n<=100000,ai與bi都是有序的。
對於80%的數據n<=100000,ai,bi<=n。
對於100%的數據n<=100000,1<=ai,bi<=10^9。
思路:輸入數據後排序,兩兩比較;相同則比較下一個,否則輸出
#include<algorithm> #includeAC<iostream> #include<cstdio> #define N 100005 using namespace std; int n, m; int a[N], b[N]; int main() { // freopen("number.in","r",stdin); // freopen("number.out","w",stdout); scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a+1, a+n+1); scanf("%d", &m); for(int i = 1; i <= m; i++) scanf("%d", &b[i]); sort(b+1, b+m+1); int now = 1; for(int i = 1; i <= n; i++) { if(a[i] == b[now]) now++; else printf("%d ", a[i]); } // fclose(stdin); fclose(stdout); return 0; }
T2 (期望得分:50;實際得分:20)
一道數論好題(math)
Time Limit:1000ms Memory Limit:128MB
題目描述
rsy最近在研究歐幾裏得算法,不會的同學可以去看下課件以及代碼……
現在她想到了一個新的問題,求k個數的最大公約數!
事實上這個問題仍然很簡單。所以rsy想強化一下,她覺得最大公約數等於1就不是很有趣了。因此她想在n個數中找最多的數,使得它們的最大公約數不等於1。
現在rsy想知道,能找最多多少個數。
輸入格式(math.in)
第一行一個數n。
第二行n個數ai。
輸出格式(math.out)
一個數表示答案。
輸入樣例
5
2 3 4 5 6
輸出樣例
3
數據範圍
對於30%的數據n<=5。
對於50%的數據n<=20。
對於80%的數據n<=1000,ai<=1000。
對於100%的數據1<=n<=100000,1<=ai<=100000,數據幾乎是隨機的。
思路:枚舉 ( 1 , 100000 ] 間的每個數,定義一個變量記錄可被輸入數據整除的數的數量最多的 i
#include<algorithm> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int n, maxn; int a[1000005]; int main() { freopen("math.in","r",stdin); freopen("math.out","w",stdout); scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); sort(a+1, a+n+1); for(int i = 1; i < n; i++) { if(a[i] == 1) continue; int sum = 1; for(int j = i+1; j <= n; j++) if(a[j]%a[i] == 0) sum++; if(sum > maxn) maxn = sum; } printf("%d", maxn); fclose(stdin); fclose(stdout); return 0; }考場代碼(題意理解錯了2333)
#include<iostream> #include<cstdio> #include<iomanip> #include<algorithm> #include<map> #define N 1000100 #define max(a,b) (a>b?a:b) #define ll long long using namespace std; int n,a[N],prime[N],v[N],tot,maxn,sum=0; map<ll,int> M; void altsn() { for(ll i=2;i<=maxn;i++) { if(v[N]==0){ prime[++tot]=i; }int tp=0; for(ll j=i;j<=maxn;j+=i) { if(j<=maxn && j>=0) { prime[j]=1; if(M[j] >= 1) { tp += M[j]; } } } sum=max(tp,sum); } } int main() { freopen("math.in","r",stdin); freopen("math.out","w",stdout); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; maxn=max(a[i],maxn);M[a[i]]++; }altsn(); cout<<sum; fclose(stdin);fclose(stdout); return 0; }除std外的 rank 1
(其中用到了埃拉托斯特尼篩法來篩素數,詳見:線性篩法求素數)
#include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; int n,A,a[1000005],now,MAX,i,j; int main() { freopen("math.in","r",stdin); freopen("math.out","w",stdout); scanf("%d", &n); for (i=1; i<=n; i++) { scanf("%d", &A); a[A]++; } for (i=2; i<=1000000; i++) { now=0; for (j=i; j<=1000000; j+=i) now += a[j]; MAX = max(MAX, now); } cout<<MAX; return 0; }標程
T3 (期望得分:e。。。不是0就行;實際得分:20)
掃雷(mine)
Time Limit:1000ms Memory Limit:128MB
題目描述
rsy最近沈迷於一款叫掃雷的遊戲。
這個遊戲是這樣的。一開始網格上有n*m個位置,其中有一些位置有雷。每次rsy可以左鍵點擊一個方塊,此時若這個方塊是雷,則rsy被炸,遊戲結束,否則如果這個位置周圍8格有x個雷,則會顯示數字x。特別地,當x=0時,系統會自動左鍵點擊附近8個位置。(此時附近8個位置一定沒有雷,假如附近8個位置仍存在x=0,則繼續往外擴展)想要更進一步獲得關於題目的信息,打開程序->附近->遊戲->掃雷或者直接打開下發的可執行文件。
或者rsy右鍵點擊一個位置,標註這個位置是雷。
不幸的是,她鼠標不能左右鍵同時點擊,因此只需考慮她左鍵點擊與右鍵點擊就可以了。
註意遊戲勝利的條件是所有非雷的位置都被左鍵點擊到。(特別地,當一開始時n*m個位置都是雷時,LYK自動獲得勝利)
rsy從網上下載了金手指,很輕易地就掌握了所有雷所在的位置。rsy想通過最少的點擊次數獲得勝利(這裏的點擊次數不包括系統自動點擊)。於是他來請求你的幫助。
輸入格式(mine.in)
第一行兩個數n,m。
接下來n行,每行m個數ai,j,表示這個矩陣。若ai,j=’*’則表示這個位置是雷,若ai,j=’.’則表示不是雷。
輸出格式(mine.out)
一個數表示答案。
輸入樣例
3 3
..*
...
..*
輸出樣例
2
對於30%的數據n=1;
對於另外20%的數據n,m<=3;
對於再另外20%的數據 * 大致占矩陣的2/3且數據隨機。
對於100%的數據n,m<=1000。
思路:搜索(BFS)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<queue> #define N 1000 using namespace std; queue<int> q; int n, m; int sum, maxn, num; int map[N][N]; int vis[N][N]; string s; int dx[8] = {1, 1, 1, 0, -1, -1, -1, 0}; int dy[8] = {1, 0, -1, -1, -1, 0, 1, 1}; void dfs(int x, int y) { for(int i = 0; i < 8; i++) { int cx = x + dx[i], cy = y + dy[i]; if(map[cx][cy] == -1) continue; if(cx>=0 && cy>=0 && cx<n && cy<m && vis[cx][cy]==0) { vis[cx][cy] = 1; if(map[cx][cy] == 0) dfs(cx, cy); } } } int main() { freopen("mine.in","r",stdin); freopen("mine.out","w",stdout); scanf("%d%d", &n, &m); for(int i = 0; i < n; i++) { cin >> s; for(int j = 0; j < m; j++) { if(s[j] == ‘*‘) { map[i][j] = -1; if(map[i+1][j] != -1) map[i+1][j]++; if(map[i+1][j+1] != -1) map[i+1][j+1]++; if(map[i+1][j-1] != -1) map[i+1][j-1]++; if(map[i-1][j] != -1) map[i-1][j]++; if(map[i-1][j+1] != -1) map[i-1][j+1]++; if(map[i-1][j-1] != -1) map[i-1][j-1]++; if(map[i][j+1] != -1) map[i][j+1]++; if(map[i][j-1] != -1) map[i][j-1]++; } else if(s[j]==‘.‘ && map[i][j]==0) map[i][j] = 0; } } for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(map[i][j]==0 && vis[i][j]==0) dfs(i, j), num++; for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) if(vis[i][j]==0 && map[i][j]!=-1) num++; printf("%d", num); fclose(stdin); fclose(stdout); return 0; }考場代碼(這個好像題意也理解錯了2333)
#include<algorithm> #include<iostream> #include<iomanip> #include<cstdio> #include<map> using namespace std; int n,m,ans,bom,que[1000000][2]; int a[1005][1005]; int mx[9]={0,0,0,1,1,1,-1,-1,-1}, my[9]={0,1,-1,0,1,-1,0,1,-1}; bool vis[1005][1005]; void Print(){ for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) cout<<a[i][j]<<" "; cout<<"\n"; } cout<<"\n\n\n\n"; } void bfs(int xx,int yy){ int h=1,t=1;que[1][0]=xx;que[1][1]=yy;vis[xx][yy]=1; while(h<=t){ int x=que[h][0],y=que[h][1]; for(int i=1;i<=8;i++){ int tx=mx[i]+x,ty=my[i]+y; if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!=-1){ if(a[tx][ty]==0&&vis[tx][ty]==0){ que[++t][0]=tx;que[t][1]=ty; } } vis[tx][ty]=1; } ++h; } } int main() { freopen("mine.in","r",stdin); freopen("mine.out","w",stdout); cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { char x;cin>>x; if(x==‘*‘) a[i][j]=-1,++bom; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j]==-1){ if(a[i-1][j]!=-1) ++a[i-1][j]; if(a[i-1][j-1]!=-1) ++a[i-1][j-1]; if(a[i-1][j+1]!=-1) ++a[i-1][j+1]; if(a[i+1][j]!=-1) ++a[i+1][j]; if(a[i+1][j-1]!=-1) ++a[i+1][j-1]; if(a[i+1][j+1]!=-1) ++a[i+1][j+1]; if(a[i][j+1]!=-1) ++a[i][j+1]; if(a[i][j-1]!=-1) ++a[i][j-1]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(vis[i][j]==0&&a[i][j]==0) bfs(i,j);++ans; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(vis[i][j]==0&&a[i][j]!=-1) ++ans; cout<<ans; fclose(stdin);fclose(stdout); return 0; }rank 1 dl 的代碼(經過今晚的講題,他好像也沒看懂題,but他是怎麽A的呢??)
#include <cmath> #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <string> #include <cstring> using namespace std; int a[1005][1005],k,sum,X,n,m,i,j,sx[1000005],sy[1000005],L,R; bool v[1005][1005]; const int F1[8]= {-1,-1,-1,0,0,1,1,1}; const int F2[8]= {-1,0,1,-1,1,-1,0,1}; char s[1005][1005]; void dfs(int x, int y) { L=0; R=1; sx[1]=x; sy[1]=y; while (L!=R) { L++; if (!a[sx[L]][sy[L]] && s[sx[L]][sy[L]]==‘.‘) for (int i=0; i<8; i++) if (!v[F1[i]+sx[L]][F2[i]+sy[L]]) { v[F1[i]+sx[L]][F2[i]+sy[L]]=true; sx[++R]=F1[i]+sx[L]; sy[R]=F2[i]+sy[L]; } } } int main() { freopen("mine.in","r",stdin); freopen("mine.out","w",stdout); scanf("%d%d",&n,&m); for (i=0; i<=n+1; i++) for (j=0; j<=m+1; j++) v[i][j]=true; for (i=1; i<=n; i++) for (j=1; j<=m; j++) v[i][j]=false; for (i=1; i<=n; i++) scanf("%s",s[i]+1); for (i=1; i<=n; i++) for (j=1; j<=m; j++) if (s[i][j]==‘.‘) { X=0; for (k=0; k<8; k++) if (s[i+F1[k]][j+F2[k]]==‘*‘) X++; a[i][j]=X; } for (i=1; i<=n; i++) for (j=1; j<=m; j++) if (!a[i][j] && s[i][j]==‘.‘ && !v[i][j]) { sum++; v[i][j]=true; dfs(i,j); } for (i=1; i<=n; i++) for (j=1; j<=m; j++) if (s[i][j]==‘.‘ && !v[i][j]) sum++; cout<<sum; return 0; }標程
開學第四測