暑期集訓補題系列Day1--模擬/暴力求解
阿新 • • 發佈:2018-12-10
開學已經二十天了,今晚是最後一場訓練賽。現在是訓練賽不會做、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;
}