Zut_round 6
81339 단어 codeforces
제목: 최 장 엄격 한 상승 서브 시퀀스 구하 기
#include
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e3+9;
#define line '
'
#define gt getchar()
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
int a[N],dp[N];
int main()
{
int n=read();for(int i=1;i<=n;++i)a[i]=read(),dp[i]=1;
int ans=1;
for(int i=2;i<=n;++i){
for(int j=1;j<i;++j)
if(a[j]<a[i])dp[i]=max(dp[j]+1,dp[i]);
ans=max(ans,dp[i]);
}
cout<<ans<<line;
return 0;
}
B. 다단 계 의사 결정 dp 템 플 릿 (hdu 2059)
제목: L 길이 의 트랙 에서 거북 이 는 전차 에 전기 가 있 을 때 속도 x, y 가 항정 속도 v 의 토끼 보다 먼저 종점 에 도착 할 수 있 습 니까? 트랙 에 n 개의 속성 이 있 는 충전소 가 있 습 니 다.
사고: 같은 거리 에서 시간 을 비교 하고 dp [i] 를 제 j (ji) 로 정의 합 니 다.
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e2+9;
#define line '
'
#define gt getchar()
#define mid ((L+R)>>1)
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
double L,a[N],dp[N];
int main()
{
int n,s,t,v,x,y;
while(cin>>L){
cin>>n>>s>>t>>v>>x>>y;
for(int i=1;i<=n;++i)a[i]=read(),dp[i]=INT_MAX;
a[n+1]=L;dp[0]=0;dp[n+1]=INT_MAX;
for(int i=1;i<=n+1;++i)for(int j=0;j<i;++j){
double mx=0;
if(a[i]-a[j]>s)mx=(a[i]-a[j]-s)/y+s*1.0/x;
else mx=(a[i]-a[j])/x;
mx+=dp[j];
if(j)mx+=t;
dp[i]=min(dp[i],mx);
}
if(dp[n+1]<L/v)cout<<"What a pity rabbit!"<<line;
else cout<<"Good job,rabbit!"<<line;
}
return 0;
}
C、CodeForces - 1077A
제목: k 차 조작, a 감 b 를 추가 하여 순서대로 진행 하고 마지막 결 과 를 묻는다.
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e3+9;
#define line '
'
#define gt getchar()
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
int main()
{
int T=read();
while(T--){
LL a=read(),b=read(),k=read();
LL ans=k/2*(a-b);
if(k&1)ans+=a;
cout<<ans<<line;
}
return 0;
}
D、CodeForces - 1077B
제목: 각 아파트 의 불 은 0, 1 두 가지 상태 이 고 101 형 아 파 트 는 방 해 를 받 을 수 있 으 며 최소 불 을 끄 는 개 수 를 구하 여 각 아파트 가 방 해 를 받 지 않도록 한다.
사고: 실제 적 으로 10101 과 101 이 몇 개 있 는 지 찾 는 것 이다. 최소 불 끄 는 횟수 는 모두 1 이 고 다른 예 를 들 어 1010101, 101010101 등 은 모두 이 두 가지 상황 으로 전환 할 수 있 으 며 통 계 를 하면 된다.
#include
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e2+9;
#define line '
'
#define gt getchar()
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
int main()
{
string str="";int a;
int n=read();for(int i=1;i<=n;++i)a=read(),str+='0'+a;
str+="000000";int i=0,ans=0;
while(i<=n){
if(str.substr(i,5)=="10101")ans++,i+=4;
else if(str.substr(i,3)=="101")ans++,i+=2;
else i++;
}
cout<<ans<<line;
return 0;
}
E、CodeForces - 1077C
제목: n 개 수 에서 어떤 수 를 삭제 할 수 있 는 지 판단 하여 나머지 수의 한 수 를 다른 모든 수의 합 으로 만 듭 니 다.
사고: 기록 총화, 순환 은 이 수 를 삭제 하 는 것 이 조건 을 만족 시 킬 수 있 는 지 를 순서대로 판단 한다.
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=2e5+9;
#define line '
'
#define gt getchar()
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
LL sum,a[N];
unordered_map<LL,int> mp;
int main()
{
int n=read();for(int i=1;i<=n;++i)a[i]=read(),sum+=a[i],mp[a[i]]++;
vector<int> V;
for(int i=1;i<=n;++i){
mp[a[i]]--;
LL t=sum-a[i];
if(!(t&1)&&mp[t/2])V.push_back(i);
mp[a[i]]++;
}
cout<<V.size()<<line;
for(auto it:V)cout<<it<<" ";
cout<<line;
return 0;
}
F、CodeForces - 1077D
제목: n 개 수 중에서 k 개 수 를 선택 하여 이 k 개 수 를 n 개 수의 중복 횟수 에서 가장 많은 사고 방향 으로 한다. 중복 횟수 가 가장 많 고 직접 2 분 중복 횟수 로 이때 중복 횟수 를 만족 시 키 는 개수 가 k 개 보다 클 수 있 는 지 판단 한다.
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=2e5+9;
#define line '
'
#define gt getchar()
#define mid ((L+R)>>1)
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
unordered_map<int,int> mp;
int n,k,x;
bool judge(int t)
{
int num=0;
for(auto it:mp)num+=it.second/t;
return num>=k;
}
int main()
{
n=read(),k=read();for(int i=1;i<=n;++i)x=read(),mp[x]++;
int L=1,R=n,ans;
while(L<=R){
if(judge(mid)){
ans=mid;
L=mid+1;
}
else R=mid-1;
}
for(auto it:mp){
if(k==0)break;
int y=min(k,it.second/ans);
k-=y;
while(y--)cout<<it.first<<" ";
}
cout<<line;
return 0;
}
G、CodeForces - 1077E
제목: 정의 서열 F: (x, 2x, 4x.. 곶 길이 n 인 배열 a, a [i] 가 나타 난 횟수 에 따라 서열 F 의 서열 과
사고: a [i] 범위 가 1e9 에 달 하지만 각 a [i] 의 등장 횟수 는 n 이 가장 많 고 F 서열 의 첫 번 째 항목 을 선택 하여 2 점 을 할 수 있다.
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=2e5+9;
#define line '
'
#define gt getchar()
#define mid ((L+R)>>1)
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
map<int,int> mp;
int a[N];
int main()
{
int n=read(),x;for(int i=1;i<=n;++i)x=read(),mp[x]++;
int k=0,m=0;LL ans=0;
for(auto it:mp)a[++k]=it.second,m=max(m,a[k]);
sort(a+1,a+k+1);
for(int i=1;i<=m;++i){
int t=i,L=1;
LL sum=0;
while(1){
L=lower_bound(a+L,a+k+1,t)-a;
if(L>k)break;
L++;
sum+=t;
t<<=1;
}
ans=max(ans,sum);
}
cout<<ans<<line;
return 0;
}
H、CodeForces - 1077F1
제목: n 개 수 중 x 개 수의 최대 합 을 선택 하 십시오. 그러나 임의의 연속 k 개 수 중 선택 한 것 이 있어 야 합 니 다.
사고: dp [i] [j] 를 앞의 i 개 수 에서 j 개 를 선택 하 는 최대 치 로 정의 합 니 다. 그 중에서 i 개 는 반드시 선택 하고 k 의 제한 이 있 기 때문에 마지막 k 개 수 는 반드시 선택 이 있어 야 합 법화 전이 방정식 dp [i] [j] = max (dp [i] [j], dp [p] [j - 1] + a [i]) 중 max (0, i - k) < = p
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=2e2+9;
#define line '
'
#define gt getchar()
#define mid ((L+R)>>1)
#define inf 0x3f3f3f3f3f3f3f3f
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
LL dp[N][N],a[N];
int main()
{
int n=read(),k=read(),x=read();
for(int i=1;i<=n;++i)a[i]=read();
LL ans=-1;memset(dp,-inf,sizeof(dp));
dp[0][0]=0;
for(int i=1;i<=n;++i)for(int j=1;j<=x;++j)for(int p=max(0,i-k);p<i;++p)
dp[i][j]=max(dp[i][j],dp[p][j-1]+a[i]);
for(int i=n-k+1;i<=n;++i)ans=max(ans,dp[i][x]);
cout<<ans<<line;
return 0;
}
I、CodeForces - 1077F2
单调队列维护dp[p][j-1]单增
#include
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=5e3+9;
#define line '
'
#define gt getchar()
#define mid ((L+R)>>1)
#define inf 0x3f3f3f3f3f3f3f3f
int read(){int x=0,op=1;char c=gt;while(!isdigit(c)){if(c=='-')op=-1;c=gt;}while(isdigit(c))x=x*10+c-48,c=gt;return x*op;}
LL dp[N][N],a[N],Q[N],que[N];
int main()
{
int n=read(),k=read(),x=read();
for(int i=1;i<=n;++i)a[i]=read();
LL ans=-1;memset(dp,-inf,sizeof(dp));
dp[0][0]=0;
for(int j=1;j<=x;++j){
int L=0,R=1;Q[0]=0;
for(int i=1;i<=n;++i){
while(L<R&&Q[L]<i-k)L++;
dp[i][j]=dp[Q[L]][j-1]+a[i];
while(L<R&&dp[i][j-1]>=dp[Q[R-1]][j-1])R--;
Q[R++]=i;
}
}
for(int i=n-k+1;i<=n;++i)ans=max(ans,dp[i][x]);
cout<<ans<<line;
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Codeforces Round #715 Div. 2C The Sports Festival: 구간 DP전형구간 DP의 초전형. 이하, 0-indexed. 입력을 정렬하여 어디서나 시작하고 최적으로 좌우로 계속 유지하면 좋다는 것을 알 수 있습니다. {2000})$의 주문이 된다. 우선, 입력을 소트하여 n개의 요소를 $...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.