1. 程式人生 > >開學第四測

開學第四測

ons tdi stream bom ide cst 整除 cin -s

           開學第四測(——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>
#include
<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; }
AC

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;
}
標程


開學第四測