1003 数学 , 先暴力再解方程。
在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程
2-10000 直接暴力
typedef long long LL ; LL n ; int ok(int b){ LL m = n ; int c ; while(m){ c = m % b ; if(c == 3 || c == 4 || c == 5 || c == 6){ m /= b ; continue ; } return 0 ; } return 1 ; } LL d[4] = {3LL , 4LL , 5LL , 6LL} ; int gao(LL a , LL b , LL c){ LL delta = b * b - a * c * 4 ; if( delta < 0 ) return 0 ; double sq = sqrt(double(delta)) ; LL s = LL (sq) ; if(s * s == delta){ LL a2 = a * 2 ; LL x = - b + s ; int t = 0 ; if( (x > 0) && (x % a2) == 0 ){ x = x / a2 ; if(x > 10000) t++ ; } x = - b - s ; if( (x > 0) && (x % a2) == 0 ){ x = x / a2 ; if(x > 10000) t++ ; } return t ; } return 0 ; } int main(){ int t , i , j , k , sum , T = 1 ; LL x , y , z ; cin>>t ; while(t--){ cin>>n ; printf("Case #%d: " , T++) ; if(n == 3 || n == 4 || n == 5 || n == 6){ puts("-1") ; continue ; } sum = 0 ; for(i = 2 ; i <= 10000 ; i++){ if(ok(i)) sum++ ; } for(i = 0 ; i < 4 ; i++){ x = d[i] ; for(j = 0 ; j < 4 ; j++){ y = d[j] ; if( (n > y) && ( (n-y) % x) == 0 ){ LL b = (n - y) / x ; if(b > 10000) sum++ ; } } } for(i = 0 ; i < 4 ; i++){ x = d[i] ; for(j = 0 ; j < 4 ; j++){ y = d[j] ; for(k = 0 ; k < 4 ; k++){ z = d[k] ; sum += gao(x , y , z - n) ; } } } cout<< sum << endl ; } return 0 ; }
1005 DP ,但有个贪心行政
blue影响时间, green影响值, red直接算 ,red放在尾巴最好了。
枚举尾巴red的个数。
dp[i][j] 截止到i位,j个blue的最大值。
typedef long long LL ; const int maxn = 1508 ; LL dp[maxn][maxn] ; int main(){ int T , kas = 1 ; LL n , x , y , z , t , g , b , r , s , i , j ; cin>> T ; while(T--){ cin>>n>>x>>y>>z>>t ; memset(dp , 0 , sizeof(dp)) ; for(i = 1 ; i <= n ; i++){ for(j = 0 ; j <= i ; j++){ if(j >= 1) dp[i][j] = max( dp[i-1][j-1] + (i - j) * y * (t + (j -1)* z) , dp[i-1][j] + (i-j-1) * y * (t + j * z) ) ; else dp[i][j] = dp[i-1][j] + (i-j-1) * y * (t + j * z) ; } } s = 0 ; for(r = 0 ; r <= n ; r++){ for(b = 0 ; b <= n - r ; b++){ g = n - r - b ; s = max(s , dp[n-r][b] + r * (g * y + x) * (b * z + t)) ; } } printf("Case #%d: " , kas++) ; cout << s << endl ; } return 0 ; }
1007 hash完再暴力
const int maxn = 100008 ; int x[maxn][2] , c[maxn] ; int a[maxn*5] ; struct state{ int id ; int cn ; state(){} state(int i , int j) : id(i) , cn(j){} }; vector<state> row[maxn*5] , col[maxn*5] ; vector<state> :: iterator it ; int query[maxn][2] , ask[maxn] ; int main(){ int t , i , k , n , m , cnt , T = 1 , q ; cin>>t ; while(t--){ cin>>n>>m>>k ; cnt = 0 ; for(i = 1 ; i <= k ; i++){ scanf("%d%d%d" , &x[i][0] , &x[i][1] , &c[i]) ; a[cnt++] = x[i][0] ; a[cnt++] = x[i][1] ; } cin>>q ; for(i = 1 ; i <= q ; i++){ scanf("%d%d%d" , &ask[i] , &query[i][0] , &query[i][1]) ; a[cnt++] = query[i][0] ; a[cnt++] = query[i][1] ; } sort(a , a + cnt) ; cnt = unique(a , a + cnt) - a ; for(i = 1 ; i <= k ; i++){ x[i][0] = upper_bound(a , a + cnt , x[i][0]) - a ; x[i][1] = upper_bound(a , a + cnt , x[i][1]) - a ; } for(i = 0 ; i <= cnt ; i++){ row[i].clear() ; col[i].clear() ; } for(i = 1 ; i <= k ; i++){ row[x[i][0]].push_back(state(x[i][1] , c[i])) ; col[x[i][1]].push_back(state(x[i][0] , c[i])) ; } printf("Case #%d:\n" , T++) ; for(int r = 1 ; r <= q ; r++){ int d = upper_bound(a , a + cnt , query[r][0]) - a ; int e = upper_bound(a , a + cnt , query[r][1]) - a ; int ty = ask[r] ; if(ty == 1){ if(row[d].size() == 0 || row[e].size() == 0) continue ; for(it = row[d].begin() ; it != row[d].end() ; it++){ int co = it->id ; for(i = 0 ; i < col[co].size() ; i++){ if(col[co][i].id == d) col[co][i].id = e ; } } for(it = row[e].begin() ; it != row[e].end() ; it++){ int co = it->id ; for(i = 0 ; i < col[co].size() ; i++){ if(col[co][i].id == e) col[co][i].id = d ; } } swap(row[d] , row[e]) ; } else if(ty == 2){ if(col[d].size() == 0 || col[e].size() == 0) continue ; for(it = col[d].begin() ; it != col[d].end() ; it++){ int ro = it->id ; for(i = 0 ; i < row[ro].size() ; i++){ if(row[ro][i].id == d) row[ro][i].id = e ; } } for(it = col[e].begin() ; it != col[e].end() ; it++){ int ro = it->id ; for(i = 0 ; i < row[ro].size() ; i++){ if(row[ro][i].id == e) row[ro][i].id = d ; } } swap(col[d] , col[e]) ; } else{ int ans = 0 ; for(it = row[d].begin() ; it != row[d].end() ; it++){ if(it->id == e){ ans = it->cn ; break ; } } printf("%d\n" , ans) ; } } } return 0 ; }