A. Kids Seating
题意:
要求理想的座位数之间不为1且不能相互整除
座位直接从4*n开始每次递减2倒序输出满足为2且不会互相整除
int main()
{
int t=read();
while(t--){
int n=read();
for(int i=4*n;i>2*n;i-=2){
cout<<i<<" ";
}
cout<<endl;
}
return 0;
}
B. Saving the City
题意:
1为此处有0则没有,每次引爆可以使得相邻俩位置的引爆以此类推,有俩操作:
1)花费a引爆
2)花费b在此处埋一个
求最后花费最少使得所有的都引爆
思路:
贪心,多组分解为相邻俩之间需要埋和直接引爆的花费最小值
char ch[100010];
int main() {
int t=read();
while(t--) {
int a=read();
int b=read();
int ans=0,pos=-1;
cin>>ch;
int len=strlen(ch);
for(int i=0; i<len; i++) {
if(ch[i]=='1') {
if(pos!=-1&&(i-pos-1)*b<a) {
ans+=(i-pos-1)*b;
} else ans+=a;
while(i<len&&ch[i]=='1') i++;
pos=i-1;
}
}
cout<<ans<<endl;
}
return 0;
}
C. The Delivery Dilemma
思路:
a对结果的贡献看最大值,b对结果的贡献看累计的最大值
贪心对a递增排序,b记录前缀和
最后on对当前位置判断a和b剩余的和的最大值
对结果min更新
struct node {
ll a;
ll b;
} no[200010];
bool ccmp(node a,node b) {
return a.a<b.a;
}
ll sum[200010];
int main() {
int t=read();
while(t--) {
int n=read();
for(int i=1; i<=n; i++) {
no[i].a=read();
}
for(int i=1; i<=n; i++) {
no[i].b=read();
}
sort(no+1,no+1+n,ccmp);
sum[0]=0;
for(int i=1; i<=n; i++) {
sum[i]=no[i].b+sum[i-1];
}
ll ans=sum[n];
for(int i=1; i<=n; i++) {
ans=min(ans,max(sum[n]-sum[i],no[i].a));
}
cout<<ans<<endl;
}
return 0;
}
D. Extreme Subtraction
思路:
差分,记录负值和的值判断是否大于a[1]输出yes否则输出no
int a[30010];
int cf[30010];
int main() {
int t=read();
while(t--) {
int n=read();
a[0]=0;
for(int i=1; i<=n; i++) {
a[i]=read();
cf[i]=a[i]-a[i-1];
}
int ans=0;
for(int i=2; i<=n; i++) {
if(cf[i]<0) ans=ans+(-1)*cf[i];
}
if(ans<=a[1]) printf("YES\n");
else printf("NO\n");
}
return 0;
}