首页 > 其他分享 >A-E题解

A-E题解

时间:2024-02-28 13:16:52浏览次数:38  
标签:Code int 题解 void cin solve View

A:对于任意一个满足条件的2*2矩阵,要么3个R和1个W,要么3个W和1个R。

我们以3个R和1个W举例,只有以下4中情况满足:

RR     RR     RW     WR
RW    WR    RR      RR

所以一种构造方法如下:

奇数行全部放R;偶数行奇数列放R,偶数列放W即可。

void solve() {
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i&1) cout<<'R';
            else{
                if(j&1) cout<<'R';
                else cout<<'W';
            }
        }
        cout << endl;
    }
}
View Code

 

 

B:一个很经典的贪心问题。给定一段时间和很多事件,每个事件都有开始时间和结束时间。

问你在这段事件内最多能完成多少个事件。

我们将事件按照结束时间从小到大排序,然后贪心的取即可。

struct node {
    int l,r;
    bool operator < (const node & a) const {
        return r < a.r;
    }
}k[N];
 
void solve() {
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=m;i++) cin >> k[i].l >> k[i].r;
    sort(k+1,k+m+1);
    int last=k[1].r , ans=1;
    for(int i=2;i<=m;i++) {
        int l = k[i].l , r = k[i].r;
        if(l>=last) last = r , ans++;
    }
    cout << ans << endl;
}
View Code

 

 

C:我们将每个故事按照故事大小排序,然后贪心的从小到大取即可。但是由于数据范围很大,直接暴力找会TLE。所以我们对故事按照从小到大求个前缀和,每次二分的去找可以一本书可以出多少个故事即可。

void solve() {
    int n,k;
    cin >> n >> k;
    vector<int> a(n+1) , b(n+10);
    for(int i=1;i<=n;i++) cin >> a[i];
    sort(a.begin()+1,a.end());
    for(int i=1;i<=n;i++) b[i] = b[i-1] + a[i];
    while(k--) {
        int x;
        cin >> x;
        int l=1 , r=n;
        while(l<=r){
            int mid = l+r >> 1;
            if(b[mid]>x) r = mid - 1;
            else l = mid + 1;
        }
        cout << r << ' ';
    }
}
View Code

 

 

D:给你一个只包含’ ( ’和’ ) ’的字符串,问该字符串是否是合法括号序列。(我记得C语言讲过课讲过)。

用栈维护一下即可,最后判一下栈是否非空。

void solve() {
    int n;
    string s;
    cin >> n >> s;
    stack<int> st;
    for(int i=0;i<s.size();i++) {
        if(s[i]=='(') st.push(i);
        else {
            if(st.empty()) {
                cout << "NO" << endl;
                return ;
            }
            else st.pop();
        }
    }
    if(st.size()) cout << "NO" << endl;
    else cout << "YES" << endl;
}
View Code

 

 

E:n支队伍,两两比赛。实力高的得3分,实力相同的双方都得一分。教练训练一次某支队伍,可以让该队伍实力加一。问:如果想让最后所有选手得分之和最高,教练最少训练几次。

很明显只要让所有队伍实力两两不相同即可。

将数组从小到大排序,每次若当前队伍实力小于等于上一支队伍,我们将该队伍实力变为上一支队伍实力加一,记录答案。

void solve() {
    int n;
    cin >> n;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a.begin()+1,a.end());
    int ans=0;
    for(int i=2;i<=n;i++) {
        if(a[i]<=a[i-1]) ans+=a[i-1]+1-a[i] , a[i]=a[i-1]+1;
    }
    cout << ans << endl;
}
View Code

 

标签:Code,int,题解,void,cin,solve,View
From: https://www.cnblogs.com/lzywakaka/p/18039963

相关文章

  • CF756D Bacterial Melee 题解
    给一个\(O(n^2)\)的做法。考虑从左到右扫描最终得到的字符串,如果当前的字符和前一个字符相同,就删掉这个字符。由题意可知,最终得到的字符串一定是\(s\)的一个子序列。我们定义状态\(dp[i][j]\)表示:当前子序列的最后一个字符是\(s[i]\),已经填完了最终字符串的前\(j\)个字......
  • CF1034E Little C Loves 3 III 题解
    这道题与P6097【模板】子集卷积基本相同,但是每个元素的值属于\([0,3]\),且\(n\le21\),时限\(\rm1s\)。在做P6097这道题的时候,我们多开了一维用来记录二进制下\(1\)的个数。但是这道题每个元素的值只属于\([0,3]\),我们可以用一种十分巧妙的方法:我们设\(f(x)\)表示\(......
  • P2065 [TJOI2011] 卡片 题解
    看大家建图时中间都连了质数点,发一个不用质数点的解法。我们可以先从源点向每一个蓝色卡片对应的点连一条边,再从每一个红色卡片对应的点向汇点连一条边。如果两张卡片可以一起拿走,那就在它们之间连一条边(蓝色连到红色),这些边的最大流量都是\(1\)。建好图以后我们就可以直接用Di......
  • CF111D Petya and Coloring 题解
    很明显这是一道组合题。首先特判一下,当\(m=1\)时,答案就是\(k^n\)。对于\(m>1\)的情况,我们可以得出一个结论:对于沿格子的线穿过的任何垂直线,会将棋盘分成两个非空的部分,这两个部分中的不同颜色的数量相同且总是不变。设这个不同颜色的数量为\(i\),那么左边这部分的颜色一定......
  • [USACO13MAR]Farm Painting S 题解
    看大家好多写的都用了四维偏序,给一个不用偏序的解法。简化一下题目,就是给你\(n\)个矩形,第\(i\)个矩形用\((x1_i,y1_i,x2_i,y2_i)\)表示,问你有多少个\(i\)满足:不存在另一个\(j\)使得\(x1_j\lex1_i\lex2_j\wedgey1_j\ley1_i\ley2_j\)。我们从左到右扫描每一个......
  • CF799D题解
    CF799D这里更容易进入且有翻译题意给定一个长宽为\(a\)和\(b\)的目标矩形、一个宽高为\(h\)和\(w\)的初始矩形及\(n\)个操作\(a_i\)。对于每个操作,可以将初始矩形的宽或高乘以\(a_i\),求使目标矩形能放入初始矩形的最少操作(目标矩形可以旋转90度)。解析这题算是......
  • [ABC303Ex] Constrained Tree Degree 题解
    AtCoder题面洛谷题面如果每个点的度数都知道了,那问题就转化成了P2290[HNOI2004]树的计数,直接求Prufer序列的个数即可,因为一个度数为\(d_i\)的点在Prufer序列中的出现次数是\(d_i-1\),所以答案是:\(\frac{(n-2)!}{\prod_{i=1}^{n}(d_i-1)!}\)。可以把\((n-2)!\)放到......
  • [COI2009] PLAHTE 题解
    首先对于每一个矩形,若\(x_2<0\),就将\(x_1,x_2\)均乘上\(-1\)再交换,对于\(y_1,y_2\)也做同样的操作。我们建立一个操作序列a[0~1000],和一个数组\(d\),每一个操作用\((x,y)\)表示,就是在\(d\)内把所有\(0\)到\(x\)的位置加上\(y\)。我们再定义一种新的操作\([x,y......
  • [USACO11NOV]Binary Sudoku G 题解
    定义一个\(3\times3\)的表格\(a\),表示每个小九宫格内1的个数的奇偶状态。再定义两个长为\(9\)的数组\(c0,c1\),表示每行每列上1的个数的奇偶状态。当\(d_{i,j}\)取反时,会将\(a_{[\frac{i}{3}],[\frac{j}{3}]},c0_i,c1_j\)各取反一次。要将\(a_{i,j}\)全部变为0......
  • [ABC286Ex] Don't Swim 题解
    我们首先求出线段与多边形的交点,如果交点个数\(<2\)或者有无数个交点,则可以直接输出\(S\)到\(T\)之间的距离。接下来我们考虑交点个数为\(2\)的情况。为了方便,我们记距离\(S\)最近的那个交点为\(P_1\),远的为\(P_2\)。举个例子:在这个例子中,直线\(ST\)将整个多边......