CSDN竞赛第30期题解

CSDN竞赛第30期题解

1、题目名称:天然气订单

天然气运输成本昂贵,危险性高,为了节省运输成本,提倡绿色环保,需要尽可能的优化订单配送,比如相同地区的天然
气订单可以一次性配送。 现需要向多个地区运输天然气。但是同一个地区可能有多个订单需求。当前仅只知道某些成对的
订单是同一个地区的,同一个地区的天然气需要尽可能一次性配送从而降低运输成本,所以需要尽可能的将同一个地区的
订单放在一起。订单的编号是1到n。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int s[N];
vector<int>e[N];
int find(int x){
    
    
return x==s[x]?x:s[x]=find(s[x]);
}
bool cmp(vector<int>&u,vector<int>&v){
    
    
return u[0]<v[0];
}
int main(){
    
    
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);
if(u!=v) s[u] = v;
}
rep(i,1,n){
    
    
e[find(i)].pb(i);
}
vector<vector<int> >v;
rep(i,1,n)
if(!e[i].empty()) {
    
    
//sort(e[i].begin(),e[i].end());
v.pb(e[i]);
}
sort(v.begin(),v.end(),cmp);
printf("%d\n",(int)v.size());
for(auto x:v){
    
    
sort(x.begin(),x.end());
for(auto val:x){
    
    
printf("%d ",val);
}
puts("");
}
return 0;
}

2、题目名称:小艺读书

书是人类进步的阶梯。 小艺每周因为工作的原因会选择性的每天多读几页或者少读几页。 小艺想知道一本n页的书她会在
周几读完。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int a[8];
int main(){
    
    
int n;cin>>n;
int s =0;
rep(i,1,7){
    
    
cin>>a[i];
s+=a[i];
}
//if(n==0) return puts("7"),0;
//else {
    
    
for(int i=1;;i=i%7+1){
    
    
if(n>a[i]){
    
    
n-=a[i];
}
else {
    
    
printf("%d\n",i);
return 0;
}
}
return 0;
}

3、题目名称:买苹果

小易去附近的商店买苹果,奸诈的商贩使用了捆绑交易,只提供6个每袋和8个每袋的包装(包装不可拆分)。 可是小易现在
只想购买恰好n个苹果,小易想购买尽量少的袋数方便携带。如果不能购买恰好n个苹果,小易将不会购买。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int main(){
    
    
int n;cin>>n;
int s=1e9;
for(int i=0;i*6<=n;i++){
    
    
int j = (n-i*6);
if(j%8==0){
    
    
j/=8;
s=min(s,i+j);
}
}
if(s==1e9) cout<<-1;
else cout<<s;
return 0;
}

4、题目名称:圆桌

有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,
不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。 试
问主人需要准备多少个座位,才能让每个客人舒适的坐下。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e4+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const int hashmod[4] = {
    
    402653189,805306457,1610612741,998244353};
#define mst(a,b) memset(a,b,sizeof a)
#define db double
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define x first
#define y second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define VI vector<int>
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define per(i,a,b) for(int i=a;i>=b;--i)
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr)
void Print(int *a,int n){
    
    
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
template <typename T> //x=max(x,y) x=min(x,y)
void cmx(T &x,T y){
    
    
if(x<y) x=y;
}
template <typename T>
void cmn(T &x,T y){
    
    
if(x>y) x=y;
}
int main(){
    
    
int n;
cin>>n;
vector<int>u,v;
rep(i,1,n){
    
    
int x,y;cin>>x>>y;
u.pb(x);
v.pb(y);
}
sort(u.rbegin(),u.rend());
sort(v.rbegin(),v.rend());
ll s = n;
for(int i=0;i<n;i++) s+=max(u[i],v[i]);
cout<<s;
return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/129157080