开学已经二十天了,今晚是最后一场训练赛。现在是训练赛不会做、kuangbin不会做、PAT不想刷、cf太少,所以决定补一下暑期集训的题,正好暑期集训的题是按专题来的。
C - Curriculum Vitae Codeforces - 846A
遍历每个位置,计算之前0的个数和之后1的个数,更新ans为这个值的最大值
#include
#include
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
#include
#include
#include
#include
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
#include
#include
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
#include
#include
#include
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;
}