Codeforces Round #316 (Div. 2) (ABC题)

A - Elections

题意:

每一场城市选举的结果,第一关键字是票数(降序),第二关键字是序号(升序),第一位获得胜利;
最后的选举结果,第一关键字是获胜城市数(降序),第二关键字是序号(升序),第一位获得胜利;
求最后选举获胜者。

思路:

直接模拟即可。

代码:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>

using namespace std;

#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;
const int maxn = 105;
struct C{
    int v;
    int no;
}c[maxn][maxn];

int cnt[maxn];
bool cmp(C a , C b){
    if(a.v != b.v) return a.v < b.v;
    return a.no > b.no;
}
int main(){
  //freopen("input.txt","r",stdin);
    int n,m;
    while( cin >> n >> m){
        cls(cnt);
        for(int i = 1 ; i <= m ; i++){
            for(int j = 1 ; j <= n ; j++){
                c[i][j].no = j;
                scanf("%d",&c[i][j].v);
            }
            sort(c[i]+1 , c[i]+n+1 , cmp);
            for(int j = 1 ; j <= n ; j++){
            }
            cnt[c[i][n].no]++;
        }
        int ans = n;
        int tmp = cnt[n];
        for(int i = n ; i >= 1 ; i--){
            if(tmp <= cnt[i]){
                ans = i;
                tmp = cnt[i];
            }
        }
        cout << ans << endl;
    }
    return 0;
}

B - Simple Game

题意:

Misha 与 Andrew 玩游戏,两人在1~n范围内各选一个数字(可相同),然后在1~n范围内随机出一个数字x,Misha 和 Andrew 的数字减去x的绝对值较小者获胜,若一致,则 Misha 获胜,现在已知 n 与 Misha 选择的数字,求 Andrew 胜率最高(同等胜率取最小)的数字。

思路:

分类讨论,只需要考虑 Misha 左右的位置即可,
注意 n = 1 时的情况特判。

代码:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>

using namespace std;

#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;

int main(){
//  freopen("input.txt","r",stdin);
    int m,n;
    while(cin >> n >> m){
        if(m == 1){
            if(n == 1)
                cout << 1 << endl;
            else{
                cout << m+1 << endl;
            }
            continue;
        }
        if(m == n){
            if(n == 1)
                cout << 1 << endl;
            else{
                cout << m-1 << endl;
            }
            continue;
        }
        int ans;
        if(n&1){
            int tmp = (n+1) / 2;
            if(m < tmp){
                ans = m+1;
            }
            else if(m > tmp)
                ans = m-1;
            else if(m == tmp)
                ans = m-1;
        }
        else{
            int tmp = n / 2;
            if(m < tmp){
                ans = m+1;
            }
            else if(m > tmp)
                ans = m-1;
            else if(m == tmp)
                ans = m+1;
        }
        cout << ans << endl;
    }
    return 0;
}

C - Replacement

题意:

输入一个含 ‘.’ 与小写英文字母的字符串。
定义一种操作为: 将字符串中的 “..” 替代为 “.” ;
定义字符串的价值等于最大操作次数。
现在有 m 个询问 , 每个询问都将改变字符串指定位置上的字符为指定字符,计算询问后的字符串价值。

思路:

这题神似线段树的风格(用线段树也确实可以做。
这题的关键是简化不同情况的分类讨论,我之前的想法一直是记录每一个 ‘.’ 区间的情况,然后询问时二分在哪个区间即可,结果发现写起来思路混乱毫无逻辑,又是set又是map的。。
直到在standing榜看到第二名的神牛的代码。。怒删原来代码重写了一份,简单了很多很多。

代码:
/*
* @author FreeWifi_novicer
* language : C++/C
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
#include<queue>

using namespace std;

#define clr( x , y ) memset(x,y,sizeof(x))
#define cls( x ) memset(x,0,sizeof(x))
#define mp make_pair
#define pb push_back
typedef long long lint;
typedef long long ll;
typedef long long LL;

int main(){
  //freopen("input.txt","r",stdin);
    int n , m ;
    string s;
    cin >> n >> m >> s;
    int cnt = 0;
    for( int i = 1 ; i < s.length() ; i++ ){
        if( s[i] == '.' && s[i-1] == '.') cnt ++;
    }
    for( int i = 1 ; i <= m ; i++ ){
        int p ;
        char c ;
        scanf( "%d %c" , &p , &c );
        p--;
        if( p > 0 && s[p] == '.' && s[p - 1] == '.' ) cnt--;
        if( p < s.length() && s[p] == '.' && s[p + 1] == '.' ) cnt--;
        s[p] = c;
        if( p < s.length() && s[p] == '.' && s[p + 1] == '.' ) cnt++;
        if( p > 0 && s[p] == '.' && s[p - 1] == '.' ) cnt++;
        cout << cnt << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值