Problem A - Carrot Cakes
//Author: Lixiang
#include<stdio.h>
struct A{
int n,t,k,d;
void init(){
scanf("%d%d%d%d",&n,&t,&k,&d);
}
void work(){
int a=n/k;
if(a*k<n)a++;
a*=t;
int b=d/t;
if(b*t<d)b++;
n-=b*k;
if(n<0){
puts("NO");
return ;
}
b*=t;
int c=n/k,ans;
if(c*k<n)c++;
if(c%2==1){
c=(c+1)/2;
c*=t;
ans=d+c;
}
else{
c=c/2;
c*=t;
ans=b+c;
}
if(ans<a)puts("YES");
else puts("NO");
}
}sol;
int main(){
sol.init();
sol.work();
return 0;
}
Problem B - T-shirt buying
模拟
//Author: Lixiang
#include<stdio.h>
#include<map>
#include<queue>
using namespace std;
const int maxn=200001;
struct B{
map <int,bool> used;
priority_queue <int,vector <int>,greater<int> > C[4];
int p[maxn],a[maxn],b[maxn];
int N,M;
void init(){
scanf("%d",&N);
for(int i=1;i<=N;i++)
scanf("%d",p+i);
for(int i=1;i<=N;i++)
scanf("%d",a+i);
for(int i=1;i<=N;i++)
scanf("%d",b+i);
for(int i=1;i<=N;i++){
C[a[i]].push(p[i]);
C[b[i]].push(p[i]);
used[p[i]]=1;
}
}
void work(){
scanf("%d",&M);
for(int i=1,c;i<=M;i++){
scanf("%d",&c);
while(!C[c].empty()&&!used[C[c].top()])C[c].pop();
if(C[c].empty())puts("-1");
else{
printf("%d ",C[c].top());
used[C[c].top()]=0;
}
}
}
}sol;
int main(){
sol.init();
sol.work();
return 0;
}
Problem C - Fountains
找C+C C+D D+D三种情况中最优的
二分+贪心
//Author: Lixiang
#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn=100001;
struct Fountains{
int b,p;
void init(int bb,int pp){
b=bb;p=pp;
}
bool operator<(struct Fountains b)const{
return p<b.p;
}
}f[2][maxn];
struct C{
int m[2][maxn];
int N,C,D,n1,n2;
void init(){
char ch;
scanf("%d%d%d",&N,&C,&D);
for(int i=1,b,p;i<=N;i++){
scanf("%d %d %c",&b,&p,&ch);
if(ch=='C')f[0][++n1].init(b,p);
else f[1][++n2].init(b,p);
}
sort(f[0]+1,f[0]+n1+1);
sort(f[1]+1,f[1]+n2+1);
for(int i=1;i<=n1;i++)
m[0][i]=max(m[0][i-1],f[0][i].b);
for(int i=1;i<=n2;i++)
m[1][i]=max(m[1][i-1],f[1][i].b);
}
int bs(int val,Fountains a[],int N){
int L=1,R=N,M,ans=0;
while(L<=R){
M=(L+R)/2;
if(a[M].p>val)R=M-1;
else{
L=M+1;
ans=M;
}
}
return ans;
}
void work(){
int i=bs(C,f[0],n1),j=bs(D,f[1],n2);
if(i==0){
int ans=0;
for(;j>=2;j--){
int id=bs(D-f[1][j].p,f[1],j-1);
if(id>0)ans=max(ans,m[1][id]+f[1][j].b);
}
printf("%d\n",ans);
return ;
}
if(j==0){
int ans=0;
for(;i>=2;i--){
int id=bs(C-f[0][i].p,f[0],i-1);
if(id>0)ans=max(ans,m[0][id]+f[0][i].b);
}
printf("%d\n",ans);
return ;
}
int ans=m[0][i]+m[1][j];
for(;i>=2;i--){
int id=bs(C-f[0][i].p,f[0],i-1);
if(id>0)ans=max(ans,m[0][id]+f[0][i].b);
}
for(;j>=2;j--){
int id=bs(D-f[1][j].p,f[1],j-1);
if(id>0)ans=max(ans,m[1][id]+f[1][j].b);
}
printf("%d\n",ans);
}
}sol;
int main(){
sol.init();
sol.work();
return 0;
}
Problem D - field expension
D题改了10发,下次再改