대학 1 학년 선발 전 Day 1
A, B, E, F 는 비교적 간단 하 다.
C, D 가 어려워 요.
A 문제: 정렬 에 주의 하 세 요. l 과 r 가 같 으 면 길이 가 작은 것 을 우선 삭제 합 니 다.비교적 간단 하 다.
B 문제: 아주 간단 한 확률 DP 입 니 다. 상태 이동 에 주의 하 세 요.
C 문제: 아래 에 상세 하 게 설명 한다.
D 문제: 아래 에 상세 하 게 설명 한다.
E 문제: 거꾸로 처리 하면 됩 니 다. 재 미 있 는 생각 이 있 습 니 다. 바로 알파벳 순 서 를 k 진수 로 본 다음 에 한 자리 에서 1, 진 위 를 추가 하 는 것 입 니 다. 실현 하기 가 귀 찮 습 니 다.
F 문제: 서열 을 하나의 고리 로 처리 할 수 있다. 절단 은 고 리 를 절단 하고 서열 을 두 배로 처리 하 는 길 이 는 고리 와 같다.
A 의 코드:
#include
#include
#include
#include
using namespace std;
struct hh {int l,r,len;}a[600001];
int n,ans,inf=2147483647;
int calc_r()
{
int cnt=inf;
for(int i=1;i<=n;i++) if(iy.l) return false;
else if(x.len>y.len) return true;
return false;
}
bool cmp2(hh x,hh y)
{
if(x.r>y.r) return true;
else if(x.ry.len) return true;
return false;
}
void solve()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].l>>a[i].r,a[i].len=a[i].r-a[i].l;
sort(a+1,a+n+1,cmp);
ans=max(calc_r()-calc_l(),calc_r()-calc_l());
sort(a+1,a+n+1,cmp2);
ans=max(ans,calc_r()-calc_l());
if(ans<0) ans=0;
cout<
B 의 코드:
#include
#include
#include
#include
using namespace std;
int n,n1,n2,I;
double dp[2003][2002],ans,p;
void solve()
{
cin>>n>>n1>>n2>>I>>p;
p/=100;
dp[0][0]=1,dp[1][0]=1-p,dp[1][1]=p;
for(int i=2;i<=n;i++) dp[i][0]=dp[i-1][0]*(1-p);
for(int i=2;i<=I;i++)
for(int j=1;j<=n2 && j<=i;j++)
dp[i][j]=dp[i-1][j-1]*p+dp[i-1][j]*(1-p);
for(int j=0;j<=n2-1;j++) ans+=dp[I-1][j];
printf("%.7lf",ans);
}
int main()
{
solve();
return 0;
}
C 의 코드:
하나의 더 미 를 유지 하고 모든 상태 (n 개의 숫자 선택) 의 확률 을 기록 합 니 다.
매번 최대 확률 로 답 에 추가 하고 다음 상 태 를 업데이트 합 니 다. 즉, 줄 마다 숫자의 머리 를 앞으로 이동 합 니 다.
cnt. head [i]: cnt 이 상태 에서 i 줄 숫자 헤드 의 위치;
#include
#include
#include
#include
#include
using namespace std;
const int MAXN=105;
double ma[MAXN][MAXN];
int n,m,k;
double ans;
struct hh {int head[MAXN];double sum;}cnt;
bool operator < (hh x,hh y) {return x.sum < y.sum;}
priority_queueq;
void solve()
{
cin>>n>>m>>k;
cnt.sum=1.0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
cin>>ma[i][j],ma[i][j]/=100;
sort(ma[i]+1,ma[i]+m+1),cnt.head[i]=m,cnt.sum*=ma[i][m];
}
q.push(cnt);
while(!q.empty() && k)
{
k--;
cnt=q.top(),q.pop();
ans+=cnt.sum;
for(int i=1;i<=n;i++)
{
hh v=cnt;
if(!ma[i][v.head[i]]) continue;
v.head[i]--;
v.sum=(v.sum/ma[i][v.head[i]+1])*ma[i][v.head[i]];
q.push(v);
}
}
printf("%.8lf ",ans);
return;
}
int main()
{
solve();
return 0;
}
D 의 코드:
참고:https://blog.csdn.net/Code92007/article/details/101350037
Dijkstra 는 최 단 로 를 두 번 처리 하고 모든 점 이 최 단 로 를 지나 간 횟수 를 기록 합 니 다.
배열 2 차원 에서 0 은 1 을 기점 으로 하고 1 은 n 을 기점 으로 한다.
dis [i] [0 / 1]: 출발점 에서 i 점 까지 의 최 단 길이;
num [i] [0 / 1]: 출발점 에서 종점 까지 의 최 단 로 는 1 / n 을 기점 으로 i 점 을 통과 하 는 횟수;
i 점 이 지나 갈 확률 은 (num [i] [1] * num [i] [0]) / 최 단 로 총 갯 수 입 니 다.
꽈배기 그림 에 대해 서 는 2 ^ 100000 개의 최 단 길이 존재 할 수 있 습 니 다.
따라서 ln 을 베이스 로, e ^ a + e ^ b = e ^ (a + ln (1 + e ^ (b - a)))
WA 는 16 번 을 했 는데 처음에는 특수 그림 의 존 재 를 알 아차 리 지 못 했 기 때문이다.
나중에 롱 롱 을 안 켜 서?두 번 째 야..
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll MAXN=300001;
const ll inf=2e18;
ll fst[MAXN<<1],nxt[MAXN<<1];
ll dis[MAXN][2];
ll n,m,tot;
bool vis[MAXN];
double cnt[MAXN][2];
struct hh {ll f,t;ll c;}ma[MAXN<<1];
struct sh {ll num;ll d;};
bool operator < (sh x,sh y){return x.d>y.d;}
priority_queueq;
void build(ll f,ll t,ll c)
{
ma[++tot]=(hh){f,t,c};
nxt[tot]=fst[f];
fst[f]=tot;
return;
}
double calc(double x,double y)
{
if(xdis[x][st]+ma[i].c)
{
cnt[v][st]=cnt[x][st];
dis[v][st]=dis[x][st]+ma[i].c;
q.push((sh){v,dis[v][st]});
}
else if(dis[v][st]==dis[x][st]+ma[i].c)
cnt[v][st]=calc(cnt[v][st],cnt[x][st]);
}
}
return;
}
void solve()
{
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=m;i++)
{
ll f,t,c;
scanf("%lld%lld%lld",&f,&t,&c);
build(f,t,c),build(t,f,c);
}
Dijkstra(1,0),Dijkstra(n,1);
for(ll i=1;i<=n;i++)
{
double ans=0;
if(dis[i][0]+dis[i][1]==dis[n][0])
ans=exp(cnt[i][0]+cnt[i][1]-cnt[n][0]);
printf("%.8lf ",ans*2.0);
}
return;
}
int main()
{
solve();
return 0;
}
E 의 코드:
#include
#include
#include
#include
#include
using namespace std;
const int MAXN=200001;
char a[MAXN];
int vis[MAXN];
int n,m;
string s;
int maxx=-1,minn=214748444,cnt;
int f(int x)
{
for(int i=(int)a[x]+1;i<=126;i++)
if(vis[i]) return i;
return 0;
}
void solve()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>a[i];
vis[a[i]]++;
minn=min(minn,(int)a[i]);
}
if(n=1;i--)
{
int flag=f(i);
if(flag)
{
for(int j=1;j<=i-1;j++)
cout<
F 의 코드:
#include
#include
#include
#include
#include
using namespace std;
string s;
int a[600001];
int ans=-1,cnt,n,last;
void solve()
{
cin>>s;
for(int i=0;i
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.