A. Dalton the Teacher
思路:显然我们可以在一步操作使两个sad的学生变得happy,设有s个sad的学生,那么答案显然是 。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
void solve(){
int n;
cin>>n;
int res=0;
for(int i=0,t;i<n;i++){
cin>>t;
if(t==i+1)res++;
}
cout<<(res+1)/2<<'\n';
return;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
B. Longest Divisors Interval
思路:显然l从1开始可以得到最优解。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
void solve(){
ll n;
cin>>n;
for(int i=1;i<=n+1;i++){
if(n%i!=0){
cout<<i-1<<'\n';
return;
}
}
return;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
C1. Dual (Easy Version)
思路:我们可以发现如果数组是全非负或者全非正的,那么我们可以在最多n-1次操作使其变为符合要求的。那么我们考虑如何使其变为全非负或者全非正的,我们可以找到数组中绝对值最大的数,如果其为正,那么数组所有数加上它就变为非负的;如果其为负,那么所有数加上它就变成非正的了。此操作最多也为n-1次,所以总操作为2*n-2次,满足题意。
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
void solve(){
int n;
cin>>n;
vector<int>a(n);
int t=0;
for(int i=0;i<n;i++)cin>>a[i];
for(int i=0;i<n;i++)t=max(t,abs(a[i]));
int j;
for(int i=0;i<n;i++)if(abs(a[i])==t)j=i;
vector<array<int,2>>res;
if(a[j]>0){
for(int i=0;i<n;i++){
if(a[i]<0){
res.push_back({i,j});
a[i]+=a[j];
}
}
for(int i=1;i<n;i++){
if(a[i]<a[i-1]){
res.push_back({i,j});
a[i]+=a[j];
if(a[i]>a[j])j=i;
}
}
}
else{
for(int i=0;i<n;i++){
if(a[i]>0){
res.push_back({i,j});
a[i]+=a[j];
}
}
for(int i=n-2;i>=0;i--){
if(a[i]>a[i+1]){
res.push_back({i,j});
a[i]+=a[j];
if(a[i]<a[j])j=i;
}
}
}
cout<<res.size()<<endl;
for(auto [x,y]:res)cout<<x+1<<" "<<y+1<<'\n';
return;
}
int main(){
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();