Codeforces Round 978 (Div. 2)
A. Bus to Pénjamo
#include<iostream>
using namespace std;
#include<algorithm>
int a[110];
int n,r;
int main(){
int T;cin>>T;
while(T--){
cin>>n>>r;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int b=0;int ans=0;
for(int i=1;i<=n;i++){
r-=a[i]/2;if(a[i]&1)b++;ans+=a[i]-(a[i]%2);
}
if(r>=b){
ans+=b;
}else {
ans+=2*r-b;
}
cout<<ans<<endl;
}
}
B. Kar Salesman
上限为c,彼此不同,最少分组max(mx,sum/c上取整)
#include<iostream>
using namespace std;
#define int long long
int n,x;
int a[500010];
signed main(){
int T;cin>>T;
while(T--){
cin>>n>>x;int sum=0;int mx=0;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum+=a[i];mx=max(mx,a[i]);}
cout<<max(mx,(sum+x-1)/x)<<endl;
}
}
和Codeforces Round 975 (Div. 2)C. Cards Partition同一个结论
枚举答案也就是上限c,
上限为c,彼此不同,最少分组max(mx,sum/c上取整),看能不能补齐
c能补齐,比c小的定能补齐,比c大的不一定能补齐
#include<iostream>
using namespace std;
#include<algorithm>
#define ll long long
ll n,k;
ll a[200010];
int main(){
ll T;cin>>T;
while(T--){
cin>>n>>k;ll sum=0;
for(ll i=1;i<=n;i++){scanf("%lld",&a[i]);sum+=a[i];}
sort(a+1,a+n+1);
ll c=n;
for(;c>=1;c--){
ll M=max(a[n],(sum+c-1)/c);
ll nd=c*M-sum;
if(nd<=k)break;
}
cout<<c<<endl;
}
}
D1. Asesino (Easy Version)
两个相互问,只有有冒牌货才会两个的回答不同
如果是奇数的话,最多提前问(n-1)/22次,再问2次,n+1次
问到最后也没有,(n-1)/22次,n-1次
如果是偶数的话,最多提前问n-2次,再问2次,n次
问到最后也没有,n-2次,再问两次,n次
#include<iostream>
using namespace std;
int n;
int main(){
int T;cin>>T;
while(T--){
cin>>n;int res=-1;
for(int i=1;i+1<=n;i+=2){
cout<<"? "<<i<<" "<<i+1<<endl;fflush(stdout);
int t1;cin>>t1;
cout<<"? "<<i+1<<" "<<i<<endl;fflush(stdout);
int t2;cin>>t2;
if(t1!=t2){
res=i;break;
}
}
if(n&1&&res==-1){
res=n;
cout<<"! "<<n<<endl;
continue;
}
int ans;
if(res>=2){
cout<<"? "<<1<<" "<<res<<endl;fflush(stdout);
int t1;cin>>t1;
cout<<"? "<<res<<" "<<1<<endl;fflush(stdout);
int t2;cin>>t2;
if(t1!=t2){ans=res;}else ans=res+1;
}else {
cout<<"? "<<n<<" "<<res<<endl;fflush(stdout);
int t1;cin>>t1;
cout<<"? "<<res<<" "<<n<<endl;fflush(stdout);
int t2;cin>>t2;
if(t1!=t2){ans=res;}else ans=res+1;
}
cout<<"! "<<ans<<endl;
}
}

浙公网安备 33010602011771号