暑期集训补题系列Day1--模拟/暴力求解

开学已经二十天了,今晚是最后一场训练赛。现在是训练赛不会做、kuangbin不会做、PAT不想刷、cf太少,所以决定补一下暑期集训的题,正好暑期集训的题是按专题来的。

Day1 模拟/暴力求解

C - Curriculum Vitae Codeforces - 846A
遍历每个位置,计算之前0的个数和之后1的个数,更新ans为这个值的最大值

#include <cstdio>
#include <algorithm>
using namespace std;

int a[110];

int main() {
	//freopen("input.txt", "r", stdin);
	int n;
	scanf("%d", &n);
	for(int i = 0; i < n; i++) {
		scanf("%d", &a[i]);
	}
	int ans = 1;
	for(int i = 0; i < n; i++) {
		int temp = 0;
		for(int j = 0; j <= i; j++) {
			if(!a[j]) {temp++;}
		}
		for(int j = i; j < n; j++) {
			if(a[j]) {temp++;}
		}
		ans = max(ans, temp);
	}
	printf("%d\n", ans);
	//fclose(stdin);
	return 0;
}

F - Alena And The Heater Codeforces 940D
由于l,r多解,所以我们不妨将l和r分别设为它们的极限-1e9和1e9,然后从B的第5位开始查找,由于数组可以向后传递,所以我们只需寻找与前一位相异的即可,找到后有两种情况:

1.t[i]=1,则l=max(l,max{A[i],A[i-1],A[i-2],A[i-3],A[i-4]}+1)

2.t[i]=0,则r=min(r,min{A[i],A[i-1],A[i-2],A[i-3],A[i-4]}-1)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int a[110000],b[110000];
char s[110000];
int main(){     
    int n,m,i,j,k,le=-1e9,ri=1e9;
    cin>>n;
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    scanf("%s",s+1);
    for(i=1;i<=n;i++) {
    	b[i]=s[i]-'0';
    }        
    int be=0;
    for(i=5;i<=n;i++) {
        if(b[i]!=be){
            if(b[i]==1) {
            	le=max(le,max(a[i]+1,max(a[i-1]+1,max(a[i-2]+1,max(a[i-3]+1,a[i-4]+1)))));
            }
            else {
                ri=min(ri,min(a[i]-1,min(a[i-1]-1,min(a[i-2]-1,min(a[i-3]-1,a[i-4]-1)))));
            }
            be=b[i];
        }
    }
    cout<<le<< ' ' <<ri<<endl;
    return 0;
}

G - Sonya and Robots Codeforces 1004C
记录每种数字左边一共有多少个不同种类的数字,则这些数字与当前数字可以构成一个数字对

#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
typedef long long LL;
const int N = 100005;
int arr[N],vis[N];
set<int>st;
int main(){ 
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
		vis[arr[i]]=st.size();
		st.insert(arr[i]);
	}
	LL ans=0;
	for(int i=0;i<=100000;i++)
		ans+=vis[i];
	printf("%lld\n",ans);
	return 0;
}

H - Sonya and Matrix Codeforces 1004D
https://blog.csdn.net/FSAHFGSADHSAKNDAS/article/details/80951796
x就是给出的数字中最小的出现次数不为本身值的4倍的数字

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1e6+5;

int mx, t, n, m, x, y, c[maxn], tmp[maxn];


int main()
{
    //freopen("in.txt","r",stdin);
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        int a; scanf("%d",&a);
        mx = max(mx, a);
        c[a]++;
    }
    for(int i=1;i<=t;i++)
    {
        if(c[i]!=(i<<2))
        {
            x = i;
            break;
        }
    }
    for(int n=1;n<=t;n++)
    {
        m = t/n;
        if(n*m!=t)  continue;
        y = n+m-x-mx;
        memset(tmp,0,sizeof(tmp));
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            int d = abs(x-i)+abs(y-j);
            tmp[d]++;
        }
        bool flag = true;
        for(int i=0;i<=n+m;i++)
        {
            if(tmp[i]!=c[i])  {flag=false;break;}
        }
        if(flag)
        {
            printf("%d %d\n",n,m);
            printf("%d %d\n",x,y);
            return 0;
        }
    }
    puts("-1");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/AngryDog1024/article/details/82770376