中石油省赛备战第五场

战队:Computer room white give (CRWG)

队员:刘凯 董海铮 马鸿儒

A: Assembly Required

问题描述:
Princess Lucy broke her old reading lamp, and needs a new one. The castle orders a shipment of parts from the Slick Lamp Parts Company, which produces interchangable lamp pieces.
There are m types of lamp pieces, and the shipment contained multiple pieces of each type. Making a lamp requires exactly one piece of each type. The princess likes each piece with some value, and she likes a lamp as much as the sum of how much she likes each of the pieces.
You are part of the castle staff, which has gotten fed up with the princess lately. The staff needs to propose k distinct lamp combinations to the princess (two lamp combinations are considered distinct if they differ in at least one piece). They decide to propose the k combinations she will like the least. How much will the princess like the k combinations that the staff proposes?
输入:
The first line of input contains a single integer T (1 ≤ T ≤ 10), the number of test cases. The first line of each test case contains two integers m (1 ≤ m ≤ 100), the number of lamp piece types and k (1 ≤ k ≤ 100), the number of lamps combinations to propose. The next m lines each describe the lamp parts of a type;
they begin with ni (2 ≤ ni ≤ 100), the number of pieces of this type, followed by ni integers vi,1 ,... , vi,ni(1 ≤ vi,j ≤ 10,000) which represent how much the princess likes each piece. It is guaranteed that k is no greater than the product of all ni ’s.
输出:
For each test case, output a single line containing k integers that represent how much the princess will like the proposed lamp combinations, in nondecreasing order.
input:
2
2 2
2 1 2
2 1 3
3 10
4 1 5 3 10
3 2 3 3
5 1 3 4 6 6
output:
2 3
4 5 5 6 6 7 7 7 7 7
tips:
In the first case, there are four lamp pieces, two of each type. The worst possible lamp has value 1 + 1 = 2,
while the second worst possible lamp has value 2 + 1 = 3.

题意:每组数据包含两个数m,k,m行数据每行数据选一个数,会有很多组合,输入加和前k个最小的即可。这个题可谓读题三天,做题三分钟...无解,始终维护前k个最小值即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int n, k;
int num[300];
int ans[300];
int a[10010];
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cin >> n >> k;
        int cnt = 0;
        for (int i = 1; i <= n; i++)
        {
            int m;
            cin >> m;
            for (int j = 1; j <= m; j++)
                scanf("%d", &num[j]);
            sort(num + 1, num + m + 1);
            if (cnt == 0)
            {
                cnt = min(m, k);
                for (int i = 1; i <= cnt; i++)
                    ans[i] = num[i];
            }
            else
            {
                int key = 0;
                for (int k = 1; k <= cnt; k++)
                    for (int j = 1; j <= m; j++)
                        a[++key] = (ans[k] + num[j]);
                sort(a + 1, a + 1 + key);
                cnt = min(k, key);
                for (int j = 1; j <= cnt; j++)
                    ans[j] = a[j];
            }
        }
        for (int i = 1; i <= k; i++)
            cout << ans[i] << " ";
        cout << endl;
    }
    return 0;
}

补充mhr版:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while (t--)
    {
        vector<int> ans;
        int n, m, maxn;
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
        {
            int cnt;
            cin >> cnt;
            maxn = ans.size();
            for (int j = 1; j <= cnt; j++)
            {
                int re;
                cin >> re;
                if (i == 1)
                    ans.push_back(re);
                else
                {
                    for (int k = 0; k < maxn; k++)
                        ans.push_back(ans[k] + re);
                }
            }
            for (int j = 0; j < maxn; j++)
                ans.erase(ans.begin());
            sort(ans.rbegin(), ans.rend());
            while (ans.size() > m)
                ans.erase(ans.begin());
        }
        sort(ans.begin(), ans.end());
        for (int i = 0; i < m; i++)
            cout << ans[i] << " ";
        cout << "\n";
    }
}

B: Bulbs

问题描述
Greg has an m × n grid of Sweet Lightbulbs of Pure Coolness he would like to turn on. Initially, some of the bulbs are on and some are off. Greg can toggle some bulbs by shooting his laser at them. When he shoots his laser at a bulb, it toggles that bulb between on and off. But, it also toggles every bulb directly below it,and every bulb directly to the left of it. What is the smallest number of times that Greg needs to shoot his laser to turn all the bulbs on?
输入:
The first line of input contains a single integer T (1 ≤ T ≤ 10), the number of test cases. Each test case starts with a line containing two space-separated integers m and n (1 ≤ m, n ≤ 400). The next m lines each consist of a string of length n of 1s and 0s. A 1 indicates a bulb which is on, and a 0 represents a bulb which is off.
输出:
For each test case, output a single line containing the minimum number of times Greg has to shoot his laser to turn on all the bulbs.
input:
2
3 4
0000
1110
1110
2 2
10
00
output:
1
2
tips:
In the first test case, shooting a laser at the top right bulb turns on all the bulbs which are off, and does not
toggle any bulbs which are on.
In the second test case, shooting the top left and top right bulbs will do the job.

无解,每行都搓一边就好了....

#include<iostream>
#include<map>
#include<cstring>
using namespace std;

char mp[401][401];
int n,m;
void change(int x,int y)
{
    for(int i=x+1;i<n;i++)
        mp[i][y]=!(mp[i][y]-'0')+'0';
    for(int i=y-1;i>=0;i--)
        mp[x][i]=!(mp[x][i]-'0')+'0';
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        int ans=0;
        cin>>n>>m;
        memset(mp,0,sizeof(mp));
        for(int i=0;i<n;i++)
            cin>>mp[i];
        for(int i=0;i<n;i++)
            for(int j=m-1;j>=0;j--)
                if(mp[i][j]=='0'){
                    mp[i][j]='1';
                    ans++;
                    change(i,j);
                } 
        cout<<ans<<'\n';
    }
    return 0;
}

C: Card Collecting

D: Double Elimination

E: Election of Evil

问题描述:
Dylan is a corrupt politician trying to steal an election. He has already used a mind-control technique to enslave some set U of government representatives. However, the representatives who will be choosing the winner of the election is a different set V . Dylan is hoping that he does not need to use his mind-control device again, so he is wondering which representatives from V can be convinced to vote for him by representatives from U.
Luckily, representatives can be persuasive people. You have a list of pairs (A, B) of represenatives, which indicate that A can convice B to vote for Dylan. These can work in chains; for instance, if Dylan has mind-controlled A, A can convince B, and B can convince C, then A can effectively convince C as well.
输入
The first line contains a single integer T (1 ≤ T ≤ 10), the number of test cases. The first line of each test case contains three space-separated integers, u, v, and m (1 ≤ u, v, m ≤ 10,000). The second line contains a space-separated list of the u names of representatives in U. The third line contains a space-separated list of the v names of representatives from V . Each of the next m lines contains a pair of the form A B, where A and B are names of two representatives such that A can convince B to vote for Dylan. Names are strings of length between 1 and 10 that only consists of lowercase letters (a to z).
输出
For each test case, output a space-separated list of the names of representatives from T who can be convinced to vote for Dylan via a chain from S, in alphabetical order.
INPUT:
2
1 1 1
alice
bob
alice bob
5 5 5
adam bob joe jill peter
rob peter nicole eve saul
harry ron
eve adam
joe chris
jill jack
jack saul
OUTPUT:
bob
peter saul
tips:In the second test case, Jill can convince Saul via Jack, and Peter was already mind-controlled.
这题赖我,因为我决策失误,上来光想写并查集wa的太多,甚至整个团队都丢了士气,赛后用连边加搜索一发就A了,唉,拖我出去祭天吧....



分析:离散化各人名,然后对于m条A控制B的信息,对A和B连一条单向边,然后对A进行搜索,能搜到的点全打标记,最后在B组中找被打标记的人名就是答案。刚开始我也是这么做,只不过是反向搜索,从B到A结果无限爆内存,正向搜就过了,这或许大概就是算法竞赛的神奇之处吧...

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <map>
using namespace std;
map<string, int> m;
vector<int> V[100010];
int t1[100010];
string t2[100010];
string ans[100010];
int vis[100010];
int u, v, n, cnt;
void dfs(int x)
{
    vis[x] = 1;
    for (int i = 0; i < V[x].size(); i++)
    {
        int z = V[x][i];
        if (vis[z])
            continue;
        dfs(z);
    }
}
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        cin >> u >> v >> n;
        for (int i = 0; i < u; i++)
        {
            string s;
            cin >> s;
            if (!m[s])
            {
                ++cnt;
                m[s] = cnt;
            }
            t1[i] = m[s];
        }
        for (int i = 0; i < v; i++)
        {
            string s;
            cin >> s;
            if (!m[s])
            {
                cnt++;
                m[s] = cnt;
            }
            t2[i] = s;
        }
        for (int i = 0; i < n; i++)
        {
            string s1, s2;
            cin >> s1 >> s2;
            if (!m[s1])
            {
                cnt++;
                m[s1] = cnt;
            }
            if (!m[s2])
            {
                cnt++;
                m[s2] = cnt;
            }
            V[m[s1]].push_back(m[s2]);
        }
        for (int i = 0; i < u; i++)
            dfs(t1[i]);
        int key = 0;
        for (int i = 0; i < v; i++)
        {
            if (vis[m[t2[i]]])
                ans[key++] = t2[i];
        }
        sort(ans, ans + key);
        for (int i = 0; i < key; i++)
            cout << ans[i] << " ";
        cout << endl;
        for (int i = 0; i <= cnt + 1; i++)
            V[i].clear();
        cnt = 0;
        m.clear();
        memset(vis, 0, sizeof(vis));
    }
    return 0;
}

后来看到其他学校同学的写法,还有网上的写法,大同小异....

F: Flight Plan

G: Ground Defense

题目描述
You are a denizen of Linetopia, whose n major cities happen to be equally spaced along an east-west line. In fact, they are often numbered in order from 1 to n, where 1 is the westmost city and n is the eastmost city.
Linetopia was a lovely place to live until forces from neighboring Trapez invaded. As part of Linetopia’s Shielding Lives and Protecting Citizens initiative, you have been called upon to process information about Trapezoid troop movements so we can determine which cities have been hardest hit and know where to send reinforcements.
Linetopia intelligence has discovered that the Trapezoid forces are attacking in the following pattern. They are sending massive aircraft to drop troops on Linetopia cities. Each aircraft starts at some city i, dropping s soldiers. The aircraft then proceeds to fly either east or west. Each time it flies over another city, it drops a more soldiers than it dropped on the previous city it passed. After performing d drops, the aircraft returns to Trapez to resupply.
You will be receiving intel updates that inform you of the specs of each Trapezoid aircraft passing over Linetopia. You want to answer queries that ask how many Trapezoid troops have been dropped on a particular city. Are you up to the task?
输入
The first line of input contains a single integer T (1 ≤ T ≤ 10), the number of test cases. The first line of each test case contains two integers: m (1 ≤ m ≤ 10,000), the number of updates and queries and n (1 ≤ n ≤ 500,000), the number of cities in Linetopia.
The next m lines of input are either updates or queries. Update lines begin with a capital U, then contain either a capital E (east) or W (west) to indicate direction, and then contain four integers i (1 ≤ i ≤ n), s (1 ≤ s ≤ 10,000), a (0 ≤ a ≤ 10,000), and d (1 ≤ d ≤ n). These integers signify the starting city, the starting number of soldiers, the increase in soldiers per city, and the number of drops, respectively. You can assume d never results in an aircraft flying to the west of city 1 or to the east of city n.
Query lines begin with a capital Q, and then contain a single integer i (1 ≤ i ≤ n) indicating the city being queried.
输出
For each query in the input, output a single line containing the number of Trapezoid troops dropped in that city.
INPUT:
1
8 3
U E 1 5 2 3
Q 1
Q 2
Q 3
U W 3 10 10 2
Q 1
Q 2
Q 3
OUTPUT:
1
8 3
U E 1 5 2 3
Q 1
Q 2
Q 3
U W 3 10 10 2
Q 1
Q 2
Q 3

这个是暴力??比赛时我们队光玩线段树,白给....赛后mhr一通暴力无解AC,太狗了,菜是原罪...

#include <bits/stdc++.h>
using namespace std;
struct node
{
    long long l,a,d,r;
}E[10005],W[10005];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n,m,p=0,q=0;
        cin>>n>>m;

        while(n--)
        {
            char x;
            cin>>x;
            if(x=='U')
            {
                char y;
                cin>>y;
                long long l,a,d,r;
                cin>>l>>a>>d>>r;

                if(y=='E')
                E[p++]=(node){l,a,d,r};
                else
                W[q++]=(node){l,a,d,r};
            }
            else
            {
                long long now;
                cin>>now;
                long long ans=0;
                for(int i=0;i<p;i++)
                {
                    if(now>=E[i].l&&now<=E[i].l+E[i].r-1)
                    ans+=1LL*E[i].a+(now-E[i].l)*E[i].d;
                }
                for(int i=0;i<q;i++)
                {
                    if(now>=W[i].l-W[i].r+1&&now<=W[i].l)
                    ans+=1LL*W[i].a+(W[i].l-now)*W[i].d;
                }
                cout<<ans<<"\n";
            }
        }
    }
}

H: Hunter’s Apprentice

#include <bits/stdc++.h>
using namespace std;
struct v
{
    double x,y;
}pt[66];
double cross(v a,v b)
{
    return a.x*b.y-a.y*b.x;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        double sum=0;
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>pt[i].x>>pt[i].y;
        for(int i=2;i<=n-1;i++)
        sum+=0.5*cross((v){pt[i].x-pt[1].x,pt[i].y-pt[1].y},(v){pt[i+1].x-pt[1].x,pt[i+1].y-pt[1].y});
        if(sum>0)
        cout<<"fight\n";
        else
        cout<<"run\n";
    }
}

I: Ingenious Lottery Tickets

题目描述
Your friend Superstitious Stanley is always getting himself into trouble. This time, in his Super Lotto Pick and Choose plan, he wants to get rich quick by choosing the right numbers to win the lottery. In this lottery, entries consist of six distinct integers from 1 to 49, which are written in increasing order. Stanley has compiled a list of winning entries from the last n days, and is going to use it to pick his winning numbers.
In particular, Stanley will choose the six numbers that appeared the most often. When Stanley is breaking ties, he prefers smaller numbers, except that he prefers seven to every other number. What is Stanley’s entry?
输入
The first line of input contains a single integer T (1 ≤ T ≤ 100), the number of test cases. The first line of each test case contains a single integer n (1 ≤ n ≤ 1,000), the number of winning entries that Stanley compiled. The next n lines each contain a lottery entry as described above.
输出
For each test case, output a single line containing Stanley’s entry.
水题,haizheng Tung 一发过

#include <bits/stdc++.h>
using namespace std;

struct vec{
    int name,d;
}p[50];
int a[7];
bool cmp(vec a,vec b)
{
    if(a.d==b.d)
        return a.name<b.name;
    return a.d>b.d;
}
int main()
{
    int t;
    cin>>t;
    
    while(t--)
    {
        memset(p,0,sizeof(p));
        memset(a,0,sizeof(a));
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            for(int j=0;j<6;j++){
                int x;
                cin>>x;
                p[x].d++;
                p[x].name=x;
            }
        int bk=1,f=p[7].d;
        sort(p+1,p+50,cmp);
        for(int i=1;i<=6;i++){
            if(p[i].name==7)
                bk=0;
            a[i]=p[i].name;
        }
        if(f>=p[6].d&&bk)
            a[6]=7;
        sort(a+1,a+7);
        for(int i=1;i<=6;i++)
            cout<<a[i]<<' ';
        cout<<'\n';
    }
    return 0;
}

J: Jurisdiction Disenchantment

题目描述
The Super League of Paragons and Champions (SLPC) has been monitoring a plot by a corrupt politician to steal an election. In the past week, the politican has used a mind-control technique to enslave the n representatives responsible for choosing the election’s winner. Luckily, the SLPC has managed to recruit you and hence has access to your power to break mind-control. You are able to break mind-control in an axis-aligned rectangle. Unfortunately, your power comes at a steep cost; you get a headache the next day proportional to the size of the rectangle. You do not even want to risk or think about what would happen if you tried to use your power multiple times in one day.
You have done your research and you know the position that each representative will be standing when the votes are about to be cast. You need to free enough representatives to prevent the politician from having a majority (strictly more than one-half) vote. What is the area of the smallest axis-aligned rectangle that you can affect to do this?
输入
The first line of input contains a single integer T (1 ≤ T ≤ 10), the number of test cases. The first line of each test case contains a single integer n (1 ≤ n ≤ 299, n is odd), the number of representatives. Each of the next n lines of input contains two integers, denoting the x and y coordinates of a representative. It is guaranteed that all coordinates are between −10,000 and +10,000.
输出
For each test case, output a single line containing the area of the smallest axis-aligned rectangle containing more than n/2 of the representatives.
INPUT:
2
1
1 1
3
0 0
1 4
3 2
OUTPUT:
0
4
TIPS:
In the first case, a rectangle containing a single point has an area of 0.
In the second test case, the rectangle needs to include at least two points. There are two smallest possible
rectangles; one includes (0, 0) and (1, 4) and the other includes (1, 4) and (3, 2). In either case, the area is 4.

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int x,y;
}num[666];

bool cmp1(node a,node b)
{
    return a.x<b.x;
}

bool cmp2(node a,node b)
{
    return a.y<b.y;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin>>t;

    while(t--)
    {
        int n,ans=INT_MAX;
        cin>>n;

        for(int i=0;i<n;i++)
        cin>>num[i].x>>num[i].y;

        sort(num,num+n,cmp1);

        int sum=n/2+1;
        for(int i=0;i<n;i++)
        for(int j=i+sum-1;j<n;j++)
        {
            int cha=abs(num[i].x-num[j].x);
            vector<node> now;

            for(int k=i;k<=j;k++)
            now.push_back(num[k]);

            sort(now.begin(),now.end(),cmp2);

            for(int k=0;k<=now.size()-sum;k++)
            ans=min(ans,cha*abs(now[k].y-now[k+sum-1].y));
        }
        cout<<ans<<"\n";
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,098评论 0 10
  • The Inner Game of Tennis W Timothy Gallwey Jonathan Cape ...
    网事_79a3阅读 10,997评论 2 18
  • 亲爱的: 轻轻的问一声:“你好吗?” 和你走过30多年了,照理说我你最了解你的,可是最近我照镜子,发现镜子中的你:...
    玉如蓝阅读 438评论 2 2
  • 一个阳光明媚的下午,犹如我的心情一样非常的好。等一会儿我就要去滑雪啦!我 真的是好激动,好期待呀。 ...
    卫烨彤阅读 235评论 0 0
  • 写了挺多,想了想,又删了。 反腐倡廉,简政放权,效果逐渐显现,但目前还没有完全达到预期目标。在很多看不见的地方,很...
    多拉小A阅读 129评论 0 0