歷屆試題 錯誤票據 (getchar的使用)+歷屆試題 帶分數 (全排列)+ 歷屆試題 大臣的旅費

問題描述

某涉密單位下發了某種票據,並要在年終全部收回。

每張票據有唯一的ID號。全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。

因爲工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。

你的任務是通過編程,找出斷號的ID和重號的ID。

假設斷號不可能發生在最大和最小號。

輸入格式

要求程序首先輸入一個整數N(N<100)表示後面數據行數。

接着讀入N行數據。

每行數據長度不等,是用空格分開的若干個(不大於100個)正整數(不大於100000),請注意行內和行末可能有多餘的空格,你的程序需要能處理這些空格。

每個整數代表一個ID號。

輸出格式

要求程序輸出1行,含兩個整數m n,用空格分隔。

其中,m表示斷號ID,n表示重號ID

樣例輸入1

2
5 6 8 11 9
10 12 9

樣例輸出1

7 9

樣例輸入2

6
164 178 108 109 180 155 141 159 104 182 179 118 137 184 115 124 125 129 168 196
172 189 127 107 112 192 103 131 133 169 158
128 102 110 148 139 157 140 195 197
185 152 135 106 123 173 122 136 174 191 145 116 151 143 175 120 161 134 162 190
149 138 142 146 199 126 165 156 153 193 144 166 170 121 171 132 101 194 187 188
113 130 176 154 177 120 117 150 114 183 186 181 100 163 160 167 147 198 111 119

樣例輸出2

105 120

思路:排序即可

代碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
    int t,num,n;
    int a[10000];
    char c;
    num=0;
    cin>>t;
    while(t--)
    {
        while(1)
        {
            cin>>n;
            a[num++]=n;
            c=getchar();
            if(c!=' ') break;
        }
    }
    sort(a,a+num);
    int s,e;
    for(int i=1;i<num;i++)
    {
        if(a[i]-a[i-1]!=1&&a[i]-a[i-1]!=0)
        {
            s=a[i]-1;
        }
        if(a[i]-a[i-1]==0)
        {
            e=a[i];
        }
    }
    cout<<s<<" "<<e<<endl;
    return 0;
}

--------------------------------------------------------------------------------------------------------------------------

問題描述

100 可以表示爲帶分數的形式:100 = 3 + 69258 / 714。

還可以表示爲:100 = 82 + 3546 / 197。

注意特徵:帶分數中,數字1~9分別出現且只出現一次(不包含0)。

類似這樣的帶分數,100 有 11 種表示法。

輸入格式

從標準輸入讀入一個正整數N (N<1000*1000)

輸出格式

程序輸出該數字用數碼1~9不重複不遺漏地組成帶分數表示的全部種數。

注意:不要求輸出每個表示,只統計有多少表示法!

樣例輸入1

100

樣例輸出1

11

樣例輸入2

105

樣例輸出2

6

 

思路:純暴力,全排列求解,將全排列產生的數分爲3個部分,進行驗證即可。

代碼:

#include <iostream>
#include <algorithm>
using namespace std;
int getNum(int n,int m,int a[])
{
    int ans=0;
    for(int i=n;i<m;i++)
        ans=a[i]+ans*10;
    return ans;
}
int main()
{
    int n;
    int ans=0;
    cin>>n;
    int a[]={1,2,3,4,5,6,7,8,9};
    do{
        for(int i=1;i<9;i++)
        {
            for(int j=i+1;j<9;j++)
            {
                int aa=getNum(0,i,a);
                int b=getNum(i,j,a);
                int c=getNum(j,9,a);
                if(b%c==0&&(aa+b/c)==n)
                    ans++;
            }
        }
    }while(next_permutation(a,a+9));
    cout<<ans<<endl;
    return 0;
}

----------------------------------------------------------------------------------------------------------

問題描述

很久以前,T王國空前繁榮。爲了更好地管理國家,王國修建了大量的快速路,用於連接首都和王國內的各大城市。

爲節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。

J是T國重要大臣,他巡查於各大城市之間,體察民情。所以,從一個城市馬不停蹄地到另一個城市成了J最常做的事情。他有一個錢袋,用於存放往來城市間的路費。

聰明的J發現,如果不在某個城市停下來修整,在連續行進過程中,他所花的路費與他已走過的距離有關,在走第x千米到第x+1千米這一千米中(x是整數),他花費的路費是x+10這麼多。也就是說走1千米花費11,走2千米要花費23。

J大臣想知道:他從某一個城市出發,中間不休息,到達另一個城市,所有可能花費的路費中最多是多少呢?

輸入格式

輸入的第一行包含一個整數n,表示包括首都在內的T王國的城市數

城市從1開始依次編號,1號城市爲首都。

接下來n-1行,描述T國的高速路(T國的高速路一定是n-1條)

每行三個整數Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度爲Di千米。

輸出格式

輸出一個整數,表示大臣J最多花費的路費是多少。

樣例輸入1

5
1 2 2
1 3 1
2 4 5
2 5 4

樣例輸出1

135

輸出格式

大臣J從城市4到城市5要花費135的路費。

 

思路:

深度搜索,最初想的暴力,枚舉各個點作爲起始位置,但很容易發現會TLE。那麼就需要我們的一個結論,以第一個點爲根進行dfs找到的最遠距離的點記爲a,那麼在以a爲根進行一次dfs得到的最長距離記爲答案。

代碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int vis[100005];
struct Edge{
    int u,v;
    int w;
}e[100005];
int n;
int maxx;
int pos;
void dfs(int s,int dist)  ///s表當前節點,dist表示距離
{
    if(dist>maxx)
    {
        maxx=dist;
        pos=s;
    }
    for(int i=1;i<=n-1;i++)
    {
        if(s==e[i].u&&!vis[e[i].v])
        {
            vis[e[i].v]=1;
            dfs(e[i].v,dist+e[i].w);
            vis[e[i].v]=0;
        }
        else if(s==e[i].v&&!vis[e[i].u])  ///反向
        {
            vis[e[i].u]=1;
            dfs(e[i].u,dist+e[i].w);
            vis[e[i].u]=0;
        }
    }
}
int main()
{
    memset(e,-1,sizeof(e));
    cin>>n;
    for(int i=1;i<=n-1;i++)
    {
        cin>>e[i].u>>e[i].v>>e[i].w;
    }
    maxx=0;
    memset(vis,0,sizeof(vis));
    ///先以第一個頂點爲根,進行一次dfs,
    ///找出從第一個點出發的最長的一個直徑,然後再以直徑的另外一個端點a,
    ///爲根進行一次dfs,又可以找出另外一個端點b,可以證明(a,b)即爲樹的直徑(樹上任意倆點最遠的距離)
    vis[1]=1;
    dfs(1,0);
    vis[1]=0;
    vis[pos]=1;
    dfs(pos,0);
    vis[pos]=0;
    maxx=maxx*10+((maxx*(maxx+1))/2);
    cout<<maxx<<endl;
    return 0;
}

 

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