2017 Multi-University Training Contest - Team 6

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\n", 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\n", 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\n", ans1);
    }

    return 0;
}
View Code
posted @ 2017-08-10 20:09  v9fly  阅读(200)  评论(0编辑  收藏  举报