CSDN コンテストの第 48 回問題の解決策

CSDN コンテストの第 48 回問題の解決策

1. トピック名: 最後のシャオミンは正の整数 X を選び、黒板に書きました。その後、すべての桁が消去されるまで、毎日、現在の番号の最後の桁を消去します。プロセス全体で、シャオミンは黒板に出たすべての数字を記録し、その合計を求めます。それは 564 です。シャオミンは合計を出します。シャオミンは正の整数 X と上記の結果を見つけてもらいたいと考えています。プロセスは合計です。

ll s = 0,t=0,tmp=0,a=0;
cin>>s;
t = s-s/10;
a = t;
while(true){
    
    
tmp = a;
while(tmp){
    
    
tmp = tmp/10;
t+=tmp;
}
if(s==t){
    
    
printf("%lld\n",a);
return 0;
}
else if(t<s){
    
    
a++;
t=a;
}
else {
    
    
    puts("-1");
return 0;
}
}

2. トピック名: 天然ガスの注文 天然ガスの輸送は高価かつ危険です. 輸送コストを節約し、グリーン環境保護を促進するためには、注文の配送を可能な限り最適化する必要があります. たとえば、同じ地域での天然ガスの注文一度に配達できます。天然ガスを複数の地域に輸送する必要があります。ただし、同じ地域に複数の注文需要がある場合があります。現時点でわかっているのは、一部の注文が同じ地域からのものであり、輸送コストを削減するために同じ地域の天然ガスをできるだけ一度に配送する必要があるため、できるだけ同じ地域を一緒に。オーダーには 1 から n までの番号が付けられます。

int n,m;cin>>n>>m;
rep(i,1,n) s[i]=i;
rep(i,1,m){
    
    
int u,v;cin>>u>>v;
u = find(u);
v = find(v);
s[u<v?v:u] = (u<v?u:v);
}
vector<int>v[n+1];
set<int>st;
rep(i,1,n){
    
    
st.insert(s[i]==i?i:find(s[i]));
v[s[i]==i?i:find(s[i])].pb(i);
}
printf("%d\n",(int)st.size());
rep(i,1,n){
    
    
if(i>1&&v[i-1].size()>0) puts("");
    for(int j=0;j<(int)v[i].size();j++){
    
    
if(j>0) printf(" ");
printf("%d",v[i][j]);
}
}

3. トピック名: ネットワーク障害のトラブルシューティング サイト A とサイト B のネットワーク間には n 個のノードがあり (サイト A とサイト B は含まれません)、隣接する 2 つのノードはネットワーク ケーブルで接続されています。通常の状況では、A と B は接続できます。ある日、A と B が突然切断されました。ネットワーク ケーブルの 1 つのセクション (隣接する 2 つのノード) のみに問題があることがわかっています。Xiaoming はネットワークのどのセクションを確認する必要がありますケーブル不良の質問です。彼のトラブルシューティング手順は次のとおりです。 1. 中間ノード 2 を選択します。このノードでは、A と B に接続されているかどうかが判断され、どちら側に問題があるかを判断するために使用されます。Xiaoming は、障害のあるネットワーク ケーブルが見つかることを確認するために、少なくとも何回確認する必要がありますか

int main(){
    
    
ll n ;cin>>n;
ll s = 0;
while(n){
    
    
s++;
n/=2;
}
cout<<s;

4. トピック名: 石油の輸送 石油会社は石油を場所 A と B に輸送する必要があります。2 つの場所では需要が異なり、車は一定量の石油しか運ぶことができません。計算すると、需要を満たすには、場所 A には車が必要で、場所 B には車の輸送が必要です。現在、合計 n 台の車両が各地に分散されており、各車両は A と B の間で石油を輸送することで一定の利益を得ることができます。ここで、AとBの石油需要を満たすことを前提に、最大の利益が得られるように、Aに行く車とBに石油を運ぶBを手配してください。各車両は石油を 1 か所にのみ輸送できます

int n,a,b;cin>>n>>a>>b;
int x,y;
rep(k,1,n){
    
    
scanf("%d%d",&x,&y);
for(int i=min(a,k);i>=0;i--){
    
    
for(int j=min(b,k-i);j>=0;j--){
    
    
if(j>0&&f[i][j]<f[i][j-1]+y)
f[i][j]=f[i][j-1]+y;
if(i>0&&f[i][j]<f[i-1][j]+x)
f[i][j]=f[i-1][j]+x;
}
}
}
cout<<f[a][b];

おすすめ

転載: blog.csdn.net/weixin_45750972/article/details/130431468