2016_NENU_SoftWare_Summer_ Training_2

Problem A UVALive 7214 Arithmetical CAPTCHA

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

int a[33];
char op[33];

bool dfs(int i, int flag, int sum, int val)
{
    if(i == 4)
    {
        if(flag && sum == val)
        {
            printf(" %d", a[0]);
            for(int j = 1; j < 4; j ++)
                printf(" %c %d", op[j], a[j]);
            puts("");
            return true;
        }
        return false;
    }
    op[i] = '+';
    if(dfs(i + 1, flag, sum + a[i], val)) return true;
    op[i] = '-';
    if(dfs(i + 1, flag, sum - a[i], val)) return true;
    op[i] = '=';
    if((!flag || sum == val) && dfs(i + 1, flag | 1, a[i], flag ? val : sum)) return true;
}

int main()
{
    int T, cas = 1;
    scanf("%d", &T);
    while(T --)
    {
        for(int i = 0; i < 4; i ++)
            scanf("%d", &a[i]);
        printf("Case #%d:", cas ++);
        dfs(1, 0, a[0], 0);
    }
    return 0;
}


Problem B UVALive 7215 Udin and Ucok

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define eps 1e-8
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

int sg[100];
int vis[100];

void init() {
    memset(sg, 0, sizeof sg);
    sg[0] = 0;
    sg[1] = sg[2] = 1;
    for(int i = 2; i <= 200; i ++) {
        memset(vis, 0,sizeof vis);
        for(int j = 1; j <= i; j ++) {
            vis[sg[max(j - 2, 0)] ^ sg[max(i - (j + 1), 0)]] = 1;
        }
        for(int j = 0; ; j ++) if(!vis[j]) {
            sg[i] = j;
            break;
        }
        if(sg[i] == 0)
        printf("i = %d  sg = %d\n", i, sg[i]);
    }
}

int main() {
//    init();
    int t, cas = 1, n;
    cin >> t;
    while(t --) {
        cin >> n;
        printf("Case #%d: ", cas ++);

        if(n < 54) {
            if(n == 4 || n == 8 || n == 14 || n == 20 || n == 24 || n == 28 || n == 34 || n == 38 || n == 42) {
                puts("UCOK");
                continue;
            }
            puts("UDIN");
            continue;
        }

        n = (n - 54) % 34;
        if(n == 0 || n == 4 || n == 8 || n == 18 || n == 22) {
            puts("UCOK");
            continue;
        }
        puts("UDIN");
        continue;
    }
    return 0;
}


Problem D UVALive 7217 An ICPC Problem without Statement

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

const int maxn=100100;

int cnt[10],t[maxn];
vector<int> vec[10],ans,ans2;

int main(){
//    freopen("in.txt","r",stdin);
    int T;scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        int n,a,b;scanf("%d%d%d",&n,&a,&b);
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<10;i++) vec[i].clear();
        for(int i=0;i<n;i++){
            int tmp;scanf("%d",&tmp);t[i]=tmp;
            cnt[tmp+2]++;
            vec[tmp+2].push_back(i+1);
        }
        ans.clear();ans2.clear();
        if(cnt[0] + cnt[1] == n && a==b&&a%2)
        {
            for(int i=0;i<vec[1].size()&&ans.size()<a;i++) ans.push_back(vec[1][i]);
            for(int i=0;i<vec[0].size()&&ans.size()<a;i++) ans.push_back(vec[0][i]);
            printf("Case #%d:\n",cas);
            printf("%d\n",ans.size());
            sort(ans.begin(),ans.end());
            for(int i=0;i<ans.size();i++) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
            continue;
        }
        if(cnt[4]>=b){
            for(int i=0;i<b;i++) ans.push_back(vec[4][i]);
        }else if(cnt[4]>=a){
            for(int i=0;i+1<vec[0].size()&&ans.size()+2<=b;i+=2) ans.push_back(vec[0][i]),ans.push_back(vec[0][i+1]);
            for(int i=0;i<vec[4].size()&&ans.size()<b;i++) ans.push_back(vec[4][i]);
            if(ans.size()+2<=b&&(cnt[0]%2)&&cnt[1]){
                ans.push_back(vec[1][0]);
                ans.push_back(vec[0][vec[0].size()-1]);
            }
        }else{
            int flag=0;
            for(int i=0;i+1<vec[0].size()&&ans.size()+2<=b;i+=2) ans.push_back(vec[0][i]),ans.push_back(vec[0][i+1]);
            for(int i = 0; i < ans.size(); i ++)
            {
                ans2.push_back(ans[i]);
            }
            for(int i=0;i<vec[4].size()&&ans.size()<b;i++) ans.push_back(vec[4][i]);
            if(ans.size()+2<=b&&vec[0].size()%2==1&&cnt[1]) flag=1,ans.push_back(vec[0][vec[0].size()-1]),ans.push_back(vec[1][0]);
            if(ans.size()<a){
                for(int i=flag;i+1<vec[1].size()&&ans.size()+2<=b;i+=2,flag=i) ans.push_back(vec[1][i]),ans.push_back(vec[1][i+1]);
            }
            if(ans.size()<a){
                for(int i=0;i<vec[3].size()&&ans.size()<a;i++) ans.push_back(vec[3][i]);
            }
            if(ans.size()<a){
                for(int i=0;i<vec[2].size()&&ans.size()<a;i++) ans.push_back(vec[2][i]);
            }
            int ope = 1;
            if(ans.size()<a && flag < vec[1].size()){
                ope *= -1;
                for(int i=flag;i<vec[1].size()&&ans.size()<a;i++) ans.push_back(vec[1][i]);
            }
            if(ans.size()<a&&(cnt[0]%2))
            {
                ans.push_back(vec[0][vec[0].size()-1]);
                ope *= -1;
//                puts("-------");
            }
            if(ope == -1 && cnt[4] && a != n)
            {
                for(int i=0;i+1<vec[4].size()&&ans2.size()<b;i++) ans2.push_back(vec[4][i]);
                if(ans2.size()+2<=b&&vec[0].size()%2==1&&cnt[1]) flag=1,ans2.push_back(vec[0][vec[0].size()-1]),ans2.push_back(vec[1][0]);
                if(ans2.size()<a){
                    for(int i=flag;i+1<vec[1].size()&&ans2.size()+2<=b;i+=2,flag=i) ans2.push_back(vec[1][i]),ans2.push_back(vec[1][i+1]);
                }
                if(ans2.size()<a){
                    for(int i=0;i<vec[3].size()&&ans2.size()<a;i++) ans2.push_back(vec[3][i]);
                }
                if(ans2.size()<a){
                    for(int i=0;i<vec[2].size()&&ans2.size()<a;i++) ans2.push_back(vec[2][i]);
                }
                if(ans2.size()<a){
                    for(int i=flag;i<vec[1].size()&&ans2.size()<a;i++) ans2.push_back(vec[1][i]);
                }
                ans.clear();
                for(int i = 0; i < ans2.size(); i ++)
                {
                    ans.push_back(ans2[i]);
                }
            }
        }
//        LL tmp=1;
//        for(int i=0;i<ans.size();i++) tmp*=1ll*t[ans[i]-1];
//        printf("%lld\n",tmp);
//        if(ans.size()<a) while(1);
        printf("Case #%d:\n",cas);
        printf("%d\n",ans.size());
        sort(ans.begin(),ans.end());
        for(int i=0;i<ans.size();i++) printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
    }
}
/*
4
16
0
16
8
32
0
2
1616
8 7 7
-2 -2 2 2 2 2 -1 -1
8 7 7
-2 -2 -2 -2 -2 -2 -1 -1
8 6 6
-2 -2 -2 -2 -2 -2 -1 -1
*/


Problem F UVALive 7219 Problem on Group Trip

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

const int maxn = 222;

struct Node
{
    int a[4], id, now;
    bool operator < (const Node& rhs) const
    {
        return id > rhs.id;
    }
};

int ed[4];

int main()
{
    int T, cas = 1, n;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        priority_queue<Node> Q[4];
        for(int i = 0; i < n; i ++)
        {
            int c = -1, a[4];
            Node tmp;
            tmp.id = i; tmp.now = 0;
            for(int j = 0; j < 3; j ++)
            {
                scanf("%d", &a[j]);
                if(c == -1 && a[j]) c = j;
                tmp.a[j] = a[j];
            }
            if(c != -1) Q[c].push(tmp);
        }
        int ans = 0;
        CLR(ed, 0);
        priority_queue<Node> Ql[4];
        while(!Q[0].empty())
        {
            Node tmp = Q[0].top();
            Q[0].pop();
            ed[0] += tmp.a[0];
            tmp.now = tmp.id;
            tmp.id = ed[0];
            if(tmp.a[1]) Ql[1].push(tmp);
            else if(tmp.a[2]) Ql[2].push(tmp);
        }
        while(!Q[1].empty() || !Ql[1].empty())
        {
//            printf("%d -> %d %d\n", Q[1].top().id, Q[1].top().now, ed[1]);
            if(!Q[1].empty())
            {
                Node tmp = Q[1].top();
                Q[1].pop();
                ed[1] += tmp.a[1];
                tmp.now = tmp.id;
                tmp.id = ed[1];
                if(tmp.a[2]) Ql[2].push(tmp);
            }
            while(!Ql[1].empty() && Ql[1].top().id <= ed[1])
            {
                Node tmp = Ql[1].top();
                Ql[1].pop();
                swap(tmp.now, tmp.id);
                Q[1].push(tmp);
            }
            if(Q[1].empty())
            {
                if(Ql[1].empty()) break;
//                puts("-----");
                ed[1] = Ql[1].top().id;
                Node tmp = Ql[1].top();
                swap(tmp.now, tmp.id);
                Q[1].push(tmp);
                Ql[1].pop();
            }
        }
//        puts("----");
        while(!Q[2].empty() || !Ql[2].empty())
        {
            if(!Q[2].empty())
            {
                Node tmp = Q[2].top();
                Q[2].pop();
                ed[2] += tmp.a[2];
            }
            while(!Ql[2].empty() && Ql[2].top().id <= ed[2])
            {
                Node tmp = Ql[2].top();
                Ql[2].pop();
                swap(tmp.now, tmp.id);
                Q[2].push(tmp);
            }
            if(Q[2].empty())
            {
                if(Ql[2].empty()) break;
                ed[2] = Ql[2].top().id;
                Node tmp = Ql[2].top();
                swap(tmp.now, tmp.id);
                Q[2].push(tmp);
                Ql[2].pop();
            }
        }
//        printf("%d -- %d -- %d\n", ed[0], ed[1], ed[2]);
        printf("Case #%d: %d\n", cas ++, max(max(ed[0], ed[1]), ed[2]));
    }
    return 0;
}


Problem G UVALive 7220 Dungeon Trap

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define inf 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

char s[200][200];
int vis[200][200][10];
pair<int, int> a, b;
int n, m;
struct node{
    int x, y, z;
    node(){}
    node(int a, int b, int c) : x(a), y(b), z(c){}
};

int nextx[] = {0, 0, 1, -1};
int nexty[] = {1, -1, 0, 0};

void bfs() {
    queue<node> q;
    memset(vis, inf, sizeof vis);
    vis[a.xx][a.yy][0] = 0;
    q.push(node(a.xx, a.yy, 0));
    while(!q.empty()) {
        node now = q.front();
//        printf("%d %d %d -> \n", now.x, now.y, now.z);
        q.pop();
        for(int i = 0; i < 4; i ++) {
            int xx = now.x + nextx[i];
            int yy = now.y + nexty[i];
            int zz = now.z;

            if(xx < 0 || yy < 0 || xx >= n || yy >= m) continue;
            int val = vis[now.x][now.y][now.z];

            if(s[xx][yy] == '0') continue;
            if(s[xx][yy] != 'A' && s[xx][yy] != 'B') {
//                printf("%d\n", val);
                val += s[xx][yy] - '0';
//                printf("%d %d -> %c ", xx, yy, s[xx][yy]);
                zz = max(zz, s[xx][yy] - '0');
//                printf("%d %d\n", val, zz);
            }
            if(vis[xx][yy][zz] <= val) continue;
            vis[xx][yy][zz] = val;
            q.push(node(xx, yy, zz));
        }
    }
}
int main() {
    int t, cas = 1;
    cin >> t;
    while(t --) {
        cin >> n >> m;
        int sum = 0;
        for(int i = 0; i < n; i ++) {
            scanf("%s", s[i]);
            for(int j = 0; j < m; j ++) {
                if(s[i][j] == 'A') a = MP(i, j);
                else if(s[i][j] == 'B') b = MP(i, j);
                else sum += s[i][j] - '0';
            }
        }

        bfs();
        int ans = 0;
        for(int i = 0; i <= 9; i ++) {
            if(vis[b.xx][b.yy][i] >= inf) continue;
            ans = max(ans, sum - vis[b.xx][b.yy][i] + i);
        }
        printf("Case #%d: %d\n", cas ++, ans);
    }
    return 0;
}


Problem I UVALive 7222 National Disaster

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

const int maxn=222;

int x[maxn],y[maxn],tmp[maxn],l[maxn];
int mp[maxn][maxn],sum[maxn][maxn],dp[maxn];
bool vis[maxn];
LL dis[maxn*maxn];
pair<LL,int> mk[maxn][maxn];

LL sqr(LL x){
    return x*x;
}

LL dist(LL x1,LL y1,LL x2,LL y2){
    return sqr(x2-x1)+sqr(y2-y1);
}

int main(){
    int T;scanf("%d",&T);
    for(int cas=1;cas<=T;cas++){
        int n;scanf("%d",&n);
        for(int i=0;i<n;i++) scanf("%d",&x[i]);
        for(int i=0;i<n;i++) scanf("%d",&y[i]);
        memset(vis,0,sizeof(vis));
        memset(mp,0,sizeof(mp));
        int m=0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++) dis[m++]=dist(x[i],y[i],x[j],y[j]);
        }
        sort(dis,dis+m);
        m=unique(dis,dis+m)-dis;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++) mk[i][j]=make_pair(dist(x[i],y[i],x[j],y[j]),j);
            sort(mk[i],mk[i]+n);
            for(int j=0;j<n;j++) scanf("%d",&tmp[j]);
            for(int j=0;j<n;j++) mp[i][j]=tmp[mk[i][j].second];
            sum[i][0]=1;
            for(int j=1;j<n;j++) sum[i][j]=sum[i][j-1]+mp[i][j];
        }
        memset(l,0,sizeof(l));
        int ansZ=maxn*maxn;
        LL ansY;
        for(int i=0;i<m;i++){
            int now=0;
            for(int j=0;j<n;j++){
                while(l[j]<n&&mk[j][l[j]].first<=dis[i]) l[j]++;
                now+=abs(sum[j][l[j]-1]-l[j])+abs(sum[j][n-1]-sum[j][l[j]-1]);
            }
            if(now<ansZ) ansZ=now,ansY=dis[i];
        }
        printf("Case #%d: %lld %d\n",cas,ansY,ansZ);
    }
    return 0;
}


Problem K UVALive 7224 Amplified Energy

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

double u[12000];
double v[12000];

double readNext() {
    char s[100];
    scanf("%s", s);
    int now = 0, pos = 0, next = 0;
    for(; s[pos] != '/'; pos ++) {
        now = now * 10 +  s[pos] - '0';
    }
    for(pos ++; s[pos]; pos ++) {
        next = next * 10 + s[pos] - '0';
    }
//    printf("%d %d\n", now, next);
    return 1.0 * now / next;
}

double dp[20000][20];
pair<int, int> path[20000][20];
int ansList[100];

int main() {
    int t, n, k, cas = 1;
    cin >> t;
    while(t --) {
        cin >> n >> k;
        for(int i = 1; i <= n; i ++) {
            u[i] = readNext();
            u[i] = log(u[i]);
        }

        vector<pair<double, int> > s;

        for(int i = 1; i <= k; i ++) {
            v[i] = readNext();
            v[i] = log(v[i]);
            s.push_back(MP(v[i], i));
        }

//        for(int i = 1; i <= n; i ++) {
//            printf("%f ", u[i]);
//        }
//        puts("");
//
//        for(int i = 1; i <= k; i ++) {
//            printf("%f ", v[i]);
//        }
//        puts("");

        sort(s.begin(), s.end());
        reverse(s.begin(), s.end());


        for(int i = 0; i <= n; i ++) {
            for(int j = 0; j <= k; j ++) {
                dp[i][j] = -1e50;
            }
        }
        dp[0][0] = 0;

        int ansi, ansj;
        double ans = -1e50;

        for(int i = 1; i <= n; i ++) {
            for(int j = k; j >= 0; j --) {
                if(j) {
                    double val1 = dp[i - 1][j - 1] + s[j - 1].xx;
                    double val2 = dp[i - 1][j] + u[i];
                    if(val2 < val1) {
                        dp[i][j] = val1;
                        path[i][j] = MP(i - 1, j - 1);
                    } else {
                        dp[i][j] = val2;
                        path[i][j] = MP(i - 1, j);
                    }
                } else {
                    dp[i][0] = dp[i - 1][0] + u[i];
                    path[i][0] = MP(i - 1, 0);
                }

                if(u[i] >= dp[i][j]) {
                    dp[i][j] = u[i];
                    path[i][j] = MP(0, 0);
                }
                if(j) {
                    if(s[j - 1].xx > dp[i][j]) {
                        dp[i][j] = s[j - 1].xx;
                        path[i][j] = MP(0, 0);
                    }
                }

                if(dp[i][j] >= ans) {
                    ans = dp[i][j];
                    ansi = i;
                    ansj = j;
                }
            }

        }
        printf("Case #%d:\n", cas ++);
        memset(ansList, 0, sizeof ansList);
        int l = ansi, r = ansi;
        while(1) {
            if(ansi == 0 && ansj == 0) break;
            l = ansi;
            int nexti = path[ansi][ansj].xx;
            int nextj = path[ansi][ansj].yy;
            if(nextj != ansj) {
                int id = nextj;
                ansList[s[id].yy] = ansi;
            }
            ansi = nexti;
            ansj = nextj;
        }
        printf("%d %d\n", l, r);
        for(int i = 1; i <= k; i ++) {
            printf("%d%c", ansList[i], i == k ? '\n' : ' ');
        }
    }
    return 0;
}


Problem L UVALive 7225 Summation and Divisor

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define xx first
#define yy second
#define LL long long
#define MP make_pair
#define INF 0x3f3f3f3f
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1|1
#define CLR(a, b) memset(a, b, sizeof(a))

using namespace std;

const int maxn = 111;

LL a[maxn];

LL gcd(LL a, LL b)
{
    return b ? gcd(b, a % b) : a;
}

int main()
{
    int T, cas = 1, n, m;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        LL sum = 0, g = 0;
        for(int i = 0; i < n; i ++)
        {
            scanf("%d", &m);
            for(int j = 0; j < m; j ++)
            {
                scanf("%lld", &a[j]);
            }
            sort(a, a + m);
            sum += a[0];
            for(int j = 1; j < m; j ++)
            {
                g = gcd(g, a[j] - a[j - 1]);
            }
        }
        g = gcd(sum, g);
        printf("Case #%d: %lld\n", cas ++, g);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值