1. 程式人生 > >暑期集訓補題系列Day1--模擬/暴力求解

暑期集訓補題系列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;
}
#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;
}