codeforce 比赛补题

Codeforces Round 723
A.Mean Inequality

题目大意
给定一个有2n个元素的数组a,要求你将其重新排列构成一个新数组 b 对于数组 b 而言
b i ≠ b i − 1 + b i + 1 2 b_i \neq \frac{b_{i-1}+b_{i+1}}{2} bi=2bi1+bi+1
b可以看作是首尾相接的。
解题思路
将a数组排序,之后每次拿出当前数组的最大值与最小值插入新的数组中,输出即可。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<stack>
using namespace std;
typedef unsigned long long ll;
typedef pair<ll, ll> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
const int M = 1e6 + 10;
int a[200];
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin >> t;
    while(t--){
        int n;
        cin>>n;
        for (int i = 1; i <= 2 * n;i++){
            cin >> a[i];
        }
        sort(a + 1, a + 2 * n + 1);
        int tot1 = 1;
        int tot2 = 2 * n;
        vector<int> ans;
        for (int i = 1; i <= n;i++){
            ans.push_back(a[tot1]);
            ans.push_back(a[tot2]);
            tot1++;
            tot2--;
        }
        for (int i = 0; i < ans.size();i++){
            cout << ans[i] << ' ';
        }
        cout << endl;
    }
 
    return 0;
}
B.I Hate 1111

题目大意
给你一个数问能否用 11, 111,1111,11111,…这些数相加表示出来。
解题思路
易得 1111, 111111, 可以用11表示出来,111,11111可以用11表示余1,所以我们直接将给定的数除11,若余数不为0,那么除11的结果在除10,看看剩余的数够不够用111表出即可。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<stack>
using namespace std;
typedef unsigned long long ll;
typedef pair<ll, ll> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
const int M = 1e6 + 10;
int a[200];
bool b[200];
int main(){
    std::ios::sync_with_stdio(false);
    ll t;
    cin >> t;
    ll dec = 11;
    vector<ll> pp;
    pp.push_back(dec);
    for (int i = 2; i <= 9;i++){
        dec += pow(10, i);
        pp.push_back(dec);
    }
    reverse(pp.begin(), pp.end());
    while (t--)
    {
        ll x;
        cin >> x;
        bool cann = 1;
        if (x < 11)
        {
            cout << "NO" << endl;
            continue;
        }
        else{
            if(x%11==0){
                cout << "YES" << endl;
                continue;
            }
            else{
                int num = x % 11;
                int nu = x / 11;
                nu /= 10;
                if(nu>=num){
                    cout << "YES" << endl;
                }
                else{
                    cout << "NO" << endl;
                }
            }
        }
    }
 
    return 0;
}
C12.Potions

题目大意
给定你一个长度为n的数组a,从左到右遍历,每个点都对应一个值 ai 每到一个点你可以选择将这个点的值加入到总值里或者跳过,总值必须要保证时刻大于等于0,求出最多可以加多少个点的值?
解题思路
直接遍历,对于大于等于0的数直接加进去,如果小于0,只要不让总值为负那么就加进去,反之在加进去的负数里最小的如果比它小,那么就把当前的数换进去,反之不动。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
ll a[N];
ll num[2010];
vector<int> G[2010];
int main(){
	int n;
	cin >> n;
	priority_queue<ll> q;
	int ans = 0;
	ll sum = 0;
	for (int i = 1; i <= n;i++){
		cin >> a[i];
		if(a[i]>=0){
			sum += a[i];
			ans++;
		}
		else{
			if(sum+a[i]>=0){
				q.push(-a[i]);
				ans++;
				sum += a[i];
			}
			else{
				if(q.size()&&q.top()>-a[i]){
					sum += q.top();
					sum += a[i];
					q.pop();
					q.push(-a[i]);
				}
			}
		}

	}
	cout << ans << endl;
	return 0;
}
DELTIX Contest
A.Game of life

题目大意
给定一个 01 序列,在每个回合如果 0 的 两边只有一个1的话,那么它就会变成 1, 输出 m 个回合后的字符串。
解题思路
对于每一个点暴力遍历即可,因为n的范围较小,判断无法变化时直接跳出即可。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
char a[2010];
int main(){
	int t;
	cin>>t;
	while(t--){
		memset(a, 0, sizeof a);
		int n, m;
		cin >> n >> m;
		for (int i = 1; i <= n;i++){
			cin >> a[i];
		}
		while(m--){
			bool cann = 0;
			vector<int> tot;
			for (int i = 1; i <= n;i++){
				int num = 0;
				if(a[i]=='0'){
					if(a[i-1]=='1')
						num++;
						if(a[i+1]=='1')
							num++;
				}
				if(num == 1){
					cann = 1;
					tot.push_back(i);
				}
			}
			if(!cann){
				break;
			}
			else{
				for (int i = 0; i < tot.size();i++){
					a[tot[i]] = '1';
				}
			}
		}
		for (int i = 1; i <= n;i++){
			cout << a[i];
		}
		cout << endl;
	}
	return 0;
}
B.Lord of the Value

题目大意
给定一个长度为 n 的数组 a (n为偶数),每次可以选两个数 i,j(i < j)做以下两种操作中的一个

  1. ai = ai + aj
  2. aj = aj - ai
    输出一种可行的方案使所有的数变为其相反数。
    解题思路
    n 为偶数可以提示可能存在某种潜藏的规律,观察可以发现,将所有数字两两分为一组,对每一组进行112112操作就可以
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
ll a[2010];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin >> n;
		for (int i = 1; i <= n;i++){
			cin >> a[i];
		}
		int tot = 2;
		cout << 6 * n / 2 << endl;
		while(tot<=n){
			cout << "1 " << tot - 1 << ' ' << tot << endl;
			cout << "1 " << tot - 1 << ' ' << tot << endl;
			cout << "2 " << tot - 1 << ' ' << tot << endl;
			cout << "1 " << tot - 1 << ' ' << tot << endl;
			cout << "1 " << tot - 1 << ' ' << tot << endl;
			cout << "2 " << tot - 1 << ' ' << tot << endl;
			tot += 2;
		}
 
	}
	return 0;
}
Compression and Expansion

题目大意
给定你n个数,每个数代表有序表的末尾的一个数,试着根据这些数字创造出一个有序表,答案可能不唯一,保证结果存在
有序表实例

解题思路
对于每个新输入的数如果为1,就将其加入一个新的子序列里,如果不为1,那么就从最深的子序列不断向上找,找到末尾比它小于1的数,加到这个子序列末尾。由于输入数据存在保证,不用担心这种方法会导致错误,用一个栈就可以维护。

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<set>
#include<stack>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int mod = 1e9 + 7;
const int N = 2e5 + 100;
ll a[2010];
vector<int> G[2010];
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin >> n;
		vector<int> ans;
		for (int i = 1; i <= n;i++){
			cin >> a[i];
			if(a[i]==1){
				ans.push_back(a[i]);
				for (int i = 0; i < ans.size();i++){
					if(i==0){
						cout << ans[i];
					}
					else{
						cout << '.' << ans[i];
					}
				}
				cout << endl;
			}
			else{
				while(ans.size()){
					int tot = ans[ans.size() - 1];
					if(tot==a[i]-1){
						ans.pop_back();
						ans.push_back(a[i]);
						break;
					}
					else{
						ans.pop_back();
					}
				}
				for (int i = 0; i < ans.size();i++){
					if(i==0){
						cout << ans[i];
					}
					else{
						cout << '.' << ans[i];
					}
				}
				cout << endl;
			}
		}
 
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: #include <stdio.h> int main(){ //定义一个3*3的数组用来存储棋盘 int board[3][3]={0}; int x,y,turn=1; while (1){ //打印棋盘 printf("当前棋盘:\n"); for (x=0;x<3;x++){ for (y=0;y<3;y++){ printf("%d ",board[x][y]); } printf("\n"); } //根据turn的值来判断谁轮到落子 if (turn==1){ printf("轮到X落子,请输入落子的位置(x y):"); }else { printf("轮到O落子,请输入落子的位置(x y):"); } scanf("%d %d",&x,&y); //将落子位置的值设置为对应的值 board[x][y] = turn; //改变轮到谁落子 turn = -turn; //判断谁赢了 if (board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[2][2]!=0){ printf("游戏结束,获胜者是%c\n",board[0][0]==1?'X':'O'); break; } if (board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[0][2]!=0){ printf("游戏结束,获胜者是%c\n",board[2][0]==1?'X':'O'); break; } for (x=0;x<3;x++){ if (board[x][0]==board[x][1] && board[x][1]==board[x][2] && board[x][2]!=0){ printf("游戏结束,获胜者是%c\n", board[x][0] == 1 ? 'X' : 'O'); break; } if (board[0][x]==board[1][x] && board[1][x]==board[2][x] && board[2][x]!=0){ printf("游戏结束,获胜者是%c\n", board[0][x] == 1 ? 'X' : 'O'); break; } } } return 0; } ### 回答2: 为了回答这个问题,需要提供题目的具体要求和规则。由于提供的信息不够具体,无法为您提供准确的代码。但是,我可以给您一个简单的Tic-tac-toe游戏的示例代码,供您参考: ```c #include <stdio.h> #include <stdbool.h> // 判断游戏是否结束 bool isGameOver(char board[][3]) { // 判断每行是否有3个相同的棋子 for(int i = 0; i < 3; i++) { if(board[i][0] != '.' && board[i][0] == board[i][1] && board[i][0] == board[i][2]) { return true; } } // 判断每列是否有3个相同的棋子 for(int i = 0; i < 3; i++) { if(board[0][i] != '.' && board[0][i] == board[1][i] && board[0][i] == board[2][i]) { return true; } } // 判断对角线是否有3个相同的棋子 if(board[0][0] != '.' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) { return true; } if(board[0][2] != '.' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) { return true; } return false; } // 输出棋盘 void printBoard(char board[][3]) { for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { printf("%c ", board[i][j]); } printf("\n"); } } int main() { char board[3][3]; // 初始化棋盘 for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { board[i][j] = '.'; } } int player = 1; // 玩家1先下 int row, col; while(true) { printf("Player %d's turn:\n", player); printf("Row: "); scanf("%d", &row); printf("Column: "); scanf("%d", &col); // 判断输入是否合法 if(row < 0 || row >= 3 || col < 0 || col >= 3 || board[row][col] != '.') { printf("Invalid move. Try again.\n"); continue; } // 下棋 board[row][col] = (player == 1) ? 'X' : 'O'; // 输出棋盘 printBoard(board); // 判断游戏是否结束 if(isGameOver(board)) { printf("Player %d wins!\n", player); break; } // 切换玩家 player = (player == 1) ? 2 : 1; } return 0; } ``` 这段代码实现了一个简单的命令行下的Tic-tac-toe游戏。玩家1使用'X'棋子,玩家2使用'O'棋子。玩家依次输入行和列,下棋后更新棋盘,并判断游戏是否结束。当游戏结束时,会输出获胜者并结束游戏。 ### 回答3: 题目要求实现一个井字棋游戏的判断胜负函数。给定一个3x3的井字棋棋盘,用C语言编写一个函数,判断当前是否存在某个玩家获胜或者平局。 题目要求代码中定义一个3x3的字符数组board来表示棋盘,其中 'X' 表示玩家1在该位置放置了一个棋子, 'O' 表示玩家2在该位置放置了一个棋子, '.' 表示该位置没有棋子。 下面是实现此题的C语言代码: ```c #include <stdio.h> #include <stdbool.h> // 用于使用bool类型 bool checkWin(char board[3][3]) { // 检查每一行是否有获胜的情况 for (int row = 0; row < 3; row++) { if (board[row][0] == board[row][1] && board[row][1] == board[row][2] && board[row][0] != '.') { return true; } } // 检查每一列是否有获胜的情况 for (int col = 0; col < 3; col++) { if (board[0][col] == board[1][col] && board[1][col] == board[2][col] && board[0][col] != '.') { return true; } } // 检查对角线是否有获胜的情况 if ((board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '.') || (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != '.')) { return true; } return false; // 没有获胜的情况 } int main() { char board[3][3]; // 存储棋盘状态 // 读取棋盘状态 for (int i = 0; i < 3; i++) { scanf("%s", board[i]); } // 调用检查胜负的函数,并输出结果 if (checkWin(board)) { printf("YES\n"); } else { printf("NO\n"); } return 0; } ``` 这个程序中定义了一个函数checkWin,用于检查是否有玩家获胜。遍历棋盘的每一行、每一列和对角线,判断是否有连续相同的字符且不为'.',如果有,则返回true;否则返回false。 在主函数main中,首先定义一个3x3的字符数组board,然后通过循环从标准输入中读取棋盘状态。接着调用checkWin函数进行胜负判断,并根据结果输出"YES"或者"NO"。最后返回0表示程序正常结束。 请注意,该代码只包含了检查胜负的功能,并没有包含其他如用户输入、判断平局等功能。如果需要完整的游戏代码,请告知具体要求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值