再寫題解前,首先得感謝一波AtCode的出題人成功浪費我一上午時間…最後還是不會(Almost Everywhere Zero),感謝哪位大佬賜教…
AB就沒有沒有什麼可說的了,看完題直接寫就行!
A. Non-zero
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
map<int,int> mp;
int main()
{
int t;cin>>t;
while(t--)
{
int n; cin>>n;
int a[200];
ll sum=0;
ll cnt=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]==0)
{
a[i]=a[i]+1;
cnt++;
}
sum=sum+a[i];
}
if(!sum)
cout<<cnt+1<<endl;
else
cout<<cnt<<endl;
}
return 0;
}
B. Assigning to Classes
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
map<int,int> mp;
int a[1111111];
int main()
{
int t; cin>>t;
while(t--)
{
int n; cin>>n;
int len=2*n;
for(int i=1;i<=len;i++)
cin>>a[i];
sort(a+1,a+len+1);
cout<<a[n+1]-a[n]<<endl;
}
return 0;
}
C. Anu Has a Function
題意:給一個數組,進行某種排序後,使得 f(f(…f(f(a1,a2),a3),…an−1),an)最大
思路:因爲f(1,0)=1,而 f(1,1)=0;f(0,1)=0;f(0,0)=0。所以直接將這個數分解成二進制得到樣子,從第最後一位向前找就行了,再處理一下同一個數字有多個的情況就行了,真的是太菜了…就這還寫了一個小時還WA掉了…
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int f[N][50];
int flag[N];
int main()
{
int n; cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
for(int j=0;j<32;j++)
{
f[i][j]=(a[i]>>j)&1;
}
}
for(int j=31;j>=0;j--)
{
int sum=0;
int cnt=0;
for(int i=0;i<n;i++)
{
if(f[i][j])
{
sum++;
cnt=i;
}
}
if(sum==1&&!flag[cnt])
{
cout<<a[cnt]<<" ";
flag[cnt]=1;
}
}
for(int i=0;i<n;i++)
if(!flag[i])
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
還有一種題解是可以化成x&(-y)…有興趣可以試試。
D. Aerodynamic
直接盜取捨友的博客23333…
題意:
題意很長,就是給一個多邊形P,然後P在原點附近平移(保證原點在P的內部或者邊上),然後P移動的區域是多邊形T,然後問P和T是否相似?
思路:
只有當P的頂點個數是偶數並且P是中心對稱圖形時才滿足題意;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
struct node
{
double x,y;
}bb[N];
int main()
{
int n;
cin >>n;
for(int i=1;i<=n;i++)
{
cin >>bb[i].x>>bb[i].y;
}
int flag=1;
if(n%2==1)
{
flag=0;
}
else
{
int j=n/2;
double x=(bb[1].x+bb[1+j].x)/2,y=(bb[1].y+bb[1+j].y)/2;
for(int i=2;i<=n/2;i++)
{
if((bb[i].x+bb[i+j].x)/2!=x||(bb[i].y+bb[i+j].y)/2!=y)
{
flag=0;
break;
}
}
}
if(flag) cout <<"YES"<<endl;
else cout <<"NO"<<endl;
}
E. Water Balance
題意:就是把某個區間的數字都變成這個區間數字和的平均數,可以操作多次,問最小的字典序。
思路:這個題還是挺好想的。假如有 a b c d e f 這6個數字,前三個數字平均數爲A,後三個爲平均數B,當你有g這個數字加進來時候,首先得看g和B的關係,假如g<B,那麼肯定能把B變得更小,這裏記爲B1,再比較B1和A的大小,如果B1比A小,那麼就可以合併成一個更大的區間。就這樣不斷加不斷維護就行,直接看代碼吧。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+7;
double a[N],len[N],st[N];
int main()
{
int n,p=0; cin>>n;
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)
{
st[++p]=a[i];
len[p]=1;
while(p>1&&st[p]<st[p-1])
{
st[p-1]=(st[p]*len[p]+st[p-1]*len[p-1])/(len[p]+len[p-1]);
len[p-1]=len[p-1]+len[p];
p--;
}
}
for(int i=1;i<=p;i++)
for(int j=1;j<=len[i];j++)
printf("%.12f\n",st[i]);
cout<<endl;
return 0;
}