CSDN竞赛第48期题解

CSDN竞赛第48期题解

1、题目名称:最后一位 小明选择了一个正整数X,然后把它写在黑板上。然后每一天他会擦掉当前数字的最后一位,直到他擦掉所有数位。 在整个过 程中,小明会把所有在黑板上出现过的数字记录下来,然后求出他们的总和sum. 例如X = 509, 在黑板上出现过的数字依次 是509, 50, 5, 他们的和就是564. 小明现在给出一个sum,小明想让你求出一个正整数X经过上述过程的结果是sum.

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地),相邻的两个节点是通过网线连接。正常的情况下,A地和B地是可 以连通的,有一天,A地和B地突然不连通了,已知只有一段网线出问题(两个相邻的节点)小明需要排查哪段网线出问题。他的排查步骤是: 1。 选择某个中间节点 2。 在这个节点上判断跟A地B地是否连通,用来判断那一边出问题 请问小 明最少要排查多少次,才能保证一定可以找到故障网线

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

4、题目名称:运输石油 某石油公司需要向A、B两地运输石油。两地的需求量不同,而一辆车只能装载一定量的石油。经过计算A地需要a辆车,B 地需要b辆车运输才能满足需求。现在一共有n辆车分布在各地,每辆车前往A、B两地运输石油均可以获得一定不等的利 润。 现在请你安排a辆车前往A地,b辆车前往B地运输石油,使得在满足A、B两地石油需求的前提下,获得最大的利润。 每辆车只能前往一地运输石油

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