这次练习从第一题开始注定水了,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; }