比赛链接
A
求两条线段交的长度。
\({\frak{code:}}\)
#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=3e3+5,p=998244353;
int a,b,c,r;
IL int in(){
char c;int f=1;
while((c=getchar())<'0'||c>'9')
if(c=='-') f=-1;
int x=c-'0';
while((c=getchar())>='0'&&c<='9')
x=x*10+c-'0';
return x*f;
}
int main()
{
int t=in();
while(t--){
a=in(),b=in(),c=in(),r=in();
if(a>b) swap(a,b);
int L=c-r,R=c+r;
if(L<=b&&R>=a) printf("%d\n",(b-a)-(min(b,R)-max(a,L)));
else printf("%d\n",b-a);
}
return 0;
}
B
考虑购买\(n\)个物品,排序,先选第\(n-k+1\)到\(n\)个物品,花费\(v_n\),再购买物品\(n-k\),以此推类,最后再一个个购买物品\(1\)到\(n\mod k\)。
\({\frak{code:}}\)
#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=2e5+5;
int n,k,p,a[N],ans,res,sum;
IL int in(){
char c;int f=1;
while((c=getchar())<'0'||c>'9')
if(c=='-') f=-1;
int x=c-'0';
while((c=getchar())>='0'&&c<='9')
x=x*10+c-'0';
return x*f;
}
int main()
{
int t=in();
while(t--){
n=in(),p=in(),k=in(),ans=0;
for(int i=1;i<=n;++i) a[i]=in();
sort(a+1,a+n+1);
for(int i=0;i<k;++i){
res=(p-=a[i]),sum=i;
if(res<0) break;
for(int j=i+k;j<=n;j+=k)
if(res>=a[j]) res-=a[j],sum+=k;
else break;
ans=max(sum,ans);
}
printf("%d\n",ans);
}
return 0;
}
C
以\(t\)为关键字排序,不严谨地说,对于前\(\forall i \in \left[ 1,n-1 \right]\)个任务,应在\(min(t_{i+1}-1,t_i,T)\)内完成,特别的,所有任务应在\(min(t_n,T)\)内完成,若时间有剩余,则贪心选择之后的\(n-i\)个任务完成。
\({\frak{code:}}\)
#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=2e5+5;
struct hh{
LL t,op;
bool operator<(const hh &a) const{
return t<a.t;}
}a[N];
LL n,k,p[N],d[2],T,ans,res,sum,n0,n1,pre[N];
IL int in(){
char c;int f=1;
while((c=getchar())<'0'||c>'9')
if(c=='-') f=-1;
int x=c-'0';
while((c=getchar())>='0'&&c<='9')
x=x*10+c-'0';
return x*f;
}
int main()
{
int t=in();
while(t--){
n=in(),T=in(),d[0]=in(),d[1]=in();n0=n1=ans=0;
for(int i=1;i<=n;++i) a[i].op=in();
for(int i=1;i<=n;++i) a[i].t=in();
sort(a+1,a+n+1);
for(int i=1;i<=n;++i) pre[i]=pre[i-1]+d[a[i].op];
if(pre[n]<=T){ans=n;goto dd;}
for(int i=n-1;~i;--i){
sum=i;if(a[i+1].op) ++n1;else ++n0;
if(a[i].t==a[i+1].t) continue;
LL s=a[i+1].t-1;s=min(s,T);
if(pre[i]>s) continue;
res=s-pre[i];
if(n0*d[0]<=res){
res-=n0*d[0],sum+=n0;
if(n1*d[1]<=res) sum+=n1;
else sum+=res/d[1];
}
else sum+=res/d[0];
ans=max(sum,ans);
}
dd:printf("%lld\n",ans);
}
return 0;
}
D
先猜\(a\),得到\(n\),再猜\(n\)个\(b\),一次可以推出字符串中\(a\)与\(b\)的个数,再每次换一个字母猜\(n-1\)次,最后一次输出答案,共猜了\(n+2\)次。
\({\frak{code:}}\)
#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=3e2+3;
int n,m,na,nb;
char c[N];
IL int in(){
char c;int f=1;
while((c=getchar())<'0'||c>'9')
if(c=='-') f=-1;
int x=c-'0';
while((c=getchar())>='0'&&c<='9')
x=x*10+c-'0';
return x*f;
}
int main()
{
puts("a"),fflush(stdout);
if(!(n=in())) return 0;
memset(c+1,'b',n),puts(c+1),fflush(stdout);
if(!(m=in())) return 0;
c[++n]='b',na=m;
for(int i=1;i<n;++i){
c[i]='a',puts(c+1),fflush(stdout);
if((m=in())<na) --na;else c[i]='b';
if(!na) return 0;
}
c[n]='a',puts(c+1),fflush(stdout),m=in();
return 0;
}
原文地址:https://www.cnblogs.com/yiqiAtiya/p/12126263.html
时间: 2024-10-10 10:50:21