Codeforces Round #618 (Div. 2)(A~E)

再寫題解前,首先得感謝一波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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章