130712周赛(CF)

时间:2023-03-09 15:13:03
130712周赛(CF)

这次练习从第一题开始注定水了,1A的题目wa了3次,第三题走进了错误的思想,wa到死....其他三个题目看都没看...........赛后慢慢搞。

A. Free Cash

巨水的一题,直接找出每个时间点出现次数最多那个值。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1050
#define INF 0x7FFFFFFF
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std; int vis[30][60]; int main()
{
int t,a,b;
cin >> t;
int max = 0;
for(int i=0; i<t; i++)
{
cin >> a >> b;
vis[a][b]++;
}
for(int i=0; i<=23; i++)
{
for(int j=0; j<=59; j++)
{
if(max < vis[i][j])
max = vis[i][j];
}
}
cout << max << endl;
return 0;
}

B. Young Table

赛后看的,special judge的话,只要交换次数不大于点的个数都行,于是有很多想法,排好序来搞,或者让当前点与它的所有右,下方点的最小值比较,大则交换。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1050
#define INF 0x7FFFFFFF
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std; int c[MAX];
int map[MAX][MAX]; struct node
{
int x1,y1,x2,y2;
} step[MAX];
int n; int main()
{
int i,j,k,tx,ty;
while(cin >> n)
{ for(i=1; i<=n; i++)
scanf("%d",&c[i]);
int cnt=0;
for(i=1; i<=n; i++)
{
for(j=1; j<=c[i]; j++)
{
scanf("%d",&map[i][j]);
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=c[i]; j++)
{
int t = map[i][j];
for(k=i; k<=n; k++)
for(int l=j; l<=c[k]; l++)
{
if(t > map[k][l])
{
t = map[k][l];
tx = k;
ty = l;
}
}
if(map[i][j] > t)
{
swap(map[i][j],map[tx][ty]);
step[cnt].x1 = i;
step[cnt].x2 = j;
step[cnt].y1 = tx;
step[cnt].y2 = ty;
cnt++;
}
}
}
cout << cnt << endl;
for(i=0; i<cnt; i++)
cout << step[i].x1 << ' ' << step[i].x2 << ' ' << step[i].y1 << ' ' << step[i].y2 << endl;
}
return 0;
}

C. Primes on Interval

wa到死....第一感觉没有往二分方向思考(还是缺少二分的感觉),个人想法是:把所有的素数列出来,如果要满足L长度范围内至少有k个素数,那么保证L长度内刚好有K个素数情况下,L能取最短。然后枚举间隔k个素数之间的长度差的最大值就是L了,但是这种思考漏洞太多,最后只能二分解决。二分L长度,找到符合要求的mid值的最小值。

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <climits>//形如INT_MAX一类的
#define MAX 1000050
#define INF 0x7FFFFFFF
# define eps 1e-5
//#pragma comment(linker, "/STACK:36777216") ///传说中的外挂
using namespace std; int prime[MAX];
int cnt[MAX];
void isprime()
{
prime[0] = 1;
prime[1] = 1;
for(int i=2; i<=1000000; i++)
{
if(prime[i] == 0)
for(int j=2*i; j<=1000000; j+=i)
prime[j] = 1;
}
} int main()
{
int a,b,k,minn = 1000000;
cin >> a >> b >> k;
isprime();
for(int i=a; i<=b ; i++)
{
if(prime[i] == 0)
cnt[i] = 1;
cnt[i] += cnt[i-1];
}
int l = 1, r = b-a+1,mid;
int ok2 = 0;
while(l <= r)
{
mid = (l+r) /2;
int ok = 0;
for(int i=a; i<=b+1-mid; i++)
{
if(cnt[i-1+mid] - cnt[i-1] < k)
{
l = mid + 1;
ok = 1;
break;
}
}
if(ok == 0)
{
ok2 = 1;
minn = min(minn,mid);
r = mid - 1;
}
}
if(ok2)
cout << minn << endl;
else
cout << -1 << endl;
return 0;
}