2017 Multi-University Training Contest - Team 6
1003 / hdu6098 暴力,思维
tags:有点贼的题。。
题解说的优雅的暴力:将A数组按值从大到小排序,对于每个下标 i 暴力找到最大的不被 i 整除的数。
这样的复杂度其实是在排序的O(n*log(n)), 两个 for循环最多是 ( n/2+n/3+......+n/n),即O(log(n))。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; pair<int , int > a[N]; int n; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); rep(i,1,n) scanf("%d", &a[i].fi), a[i].se=i; sort(a+1, a+1+n); rep(i,2,n) { per(j,n,1) { if(a[j].se%i!=0) { if(i!=n) printf("%d ", a[j].fi); else printf("%d ", a[j].fi); break; } } } } return 0; }
1008 / hdu6103 尺取法,思维
tags: 枚举两个子串的对称点,每次从对称点往两边延伸,类似尺取法。复杂度O(n^2)
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 5010; int m, ans, len; char s[N]; void solve(int x, int y) { int l1=x, r1=x, l2=y, r2=y, cnt=0; while(l1>0 && r2<=len) { while(l1>0 && r2<=len && cnt<=m) { cnt += abs(s[l1]-s[r2]); if(cnt<=m) ans = max(ans, r1-l1+1); --l1, ++r2; } while(l1<=r1 && l2<=r2 && cnt>m) { cnt -= abs(s[r1]-s[l2]); --r1, ++l2; } } } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%s", &m, s+1); ans=0, len=strlen(s+1); for(int i=1; i<=len; ++i) { solve(i-1, i+1); solve(i, i+1); } printf("%d ", ans); } return 0; }
1011 / hdu6107 签到

#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; int n, a[10], b[10]; int main() { int T; scanf("%d", &T); while(T--) { int ans1=0; scanf("%d", &n); rep(i,1,n) { int ans = 0; rep(j,1,7) scanf("%d", &a[j]); b[7]=a[7], b[6]=a[6]-b[7], b[5]=a[5]-b[7], b[4]=a[4]-b[7]; b[3]=a[3]-b[7]-b[5]-b[6]; b[2]=a[2]-b[7]-b[4]-b[5]; b[1]=a[1]-b[7]-b[4]-b[6]; bool flag=0; rep(j,1,7) { if(b[j]<0) flag=1; else ans += b[j]; } if(flag) continue; else ans1=max(ans1, ans); } printf("%d ", ans1); } return 0; }