C - Robot Takahashi (atcoder.jp)
有N个人,他们被分为小孩(0)和大人(1)第i 个人体重为Wi
机器人认为 体重<X的人是小孩,体重>=x其余的是大人。
Qes: 机器人最多将多少个人判断正确?
我认为只要找到小孩中体重的最大值,和大人中体重的最小值,如果大人的体重大于小孩体重的最大值,以及本身就是小孩的就累加ans1;同样的小孩小于大人的最小体重以及已经是大人的就累加ans2,输出两个答案中最大的那一个,但是答案错误,求样例 T-T.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
小孩 0 0 0 0
大人 0 0 0 0 0 0 0 0 0
找到样例了,如果用我的代码,ans1就是第一行紫色0的左边包括紫色加上第二行右边的0就是7,ans2就是第二行红色的0右边的所有0,答案就是0,但是可以让w=5这样的答案就是11;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int num[200005];
signed main(){
int n;
int maxx=0,minn=LLONG_MAX;
string a;
cin>>n;
cin>>a;
for(int i=0;i<n;i++){
int x;
cin>>num[i];
if(a[i]=='0'){
if(num[i]>maxx)maxx=num[i];
}
if(a[i]=='1'){
if(num[i]<minn)minn=num[i];
}
}
int ans=0;
for(int i=0;i<n;i++){
if((a[i]=='1'&&num[i]>=maxx+1)||a[i]=='0'){
ans++;
}
}
int ans2=0;
for(int i=0;i<n;i++){
if((a[i]=='0'&&num[i]<=minn-1)||a[i]=='1'){
ans2++;
}
}
ans=max(ans,ans2);
cout<<ans<<endl;
return 0;
}
正确的代码是:
就求出每个边框下,人数最多的框输出就是行,答案中为什么加2,是因为下标,当下标都为0的时候,其实是有人的,两个下标就加2;
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int a[200010];
vector<int>c;
vector<int>m;
int ans;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
string s;
cin >> s;
for(int i = 0;i < n; ++i){
cin >>a[i];
if(s[i] == '0')c.push_back(a[i]);
else m.push_back(a[i]);
}
int x = c.size(),y = m.size();
sort(c.begin(),c.end());
sort(m.begin(),m.end(),greater<int>());
ans = max(x,y);
for(int i = 0,j = y-1;i < x && y!=0; ++i){
while( m[j] <= c[i] && j > 0 ){
j--;
}
if( m[j] <= c[i] ){
cout << ans << endl;
return 0;
}
ans = max(ans,i+j+2);
}
cout << ans << endl;
return 0;
}
暴力求就行
#include<bits/stdc++.h> // 包含几乎所有标准库头文件,但不推荐在竞赛或生产环境中使用
using namespace std; // 使用标准命名空间
#define int long long // 将int重定义为long long,用于处理大整数
const int maxn = 2e5 + 10; // 定义最大可能的行数/列数,但注意这里可能超过实际需要的范围
int a[maxn]; // 声明一个整数数组a,但在代码中未使用
int b[maxn]; // 声明一个整数数组b,在代码中同样未使用
string s[maxn]; // 声明一个字符串数组s,用于存储输入的矩阵
signed main() { // 主函数,使用signed表示long long,但实际上直接写main也可以
int n; // 矩阵的边长
cin >> n; // 输入矩阵的边长
int ans = 0; // 用于记录是否找到符合条件的子矩阵,0表示未找到,非0表示找到
// 读取矩阵
for (int i = 0; i < n; i++) cin >> s[i];
// 遍历矩阵的每个位置,检查以当前位置为中心的子矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
// 检查列方向的6x1子矩阵
if (i + 5 < n) {
int cnt = 0; // 计数当前列中'.'的数量
for (int k = i; k <= i + 5; k++) cnt += s[k][j] == '.';
ans |= cnt <= 2; // 如果数量不超过2,则设置ans为1(如果已经是1则不变)
}
// 检查行方向的1x6子矩阵
if (j + 5 < n) {
int cnt = 0; // 计数当前行中'.'的数量
for (int k = j; k <= j + 5; k++) cnt += s[i][k] == '.';
ans |= cnt <= 2; // 同上
}
// 检查主对角线方向的6x6子矩阵的一部分
if (i + 5 < n && j + 5 < n) {
int cnt = 0; // 计数主对角线上'.'的数量
for (int k = 0; k <= 5; k++) cnt += s[i + k][j + k] == '.';
ans |= cnt <= 2; // 同上
}
// 检查副对角线方向的6x6子矩阵的一部分
if (i - 5 >= 0 && j + 5 < n) {
int cnt = 0; // 计数副对角线上'.'的数量
for (int k = 0; k <= 5; k++) cnt += s[i - k][j + k] == '.';
ans |= cnt <= 2; // 同上
}
}
}
// 输出结果
if (ans) cout << "Yes" << endl; // 如果ans非0(即找到符合条件的子矩阵),则输出Yes
else cout << "No" << endl; // 否则输出No
return 0; // 程序正常结束
}
将数出现的次数和数一起pop出来就行了
#include<bits/stdc++.h>
using namespace std;
#define int long long
stack<int>box;
int be,num;
stack<int>pos;
bool f=0;
signed main(){
int n;
cin>>n;
//for(int i=1;i<=n;i++)pos[i]=1;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(box.empty()){
box.push(x);
pos.push(1);
}
else {
if(x==box.top()){
pos.push(pos.top()+1);
}
else{
pos.push(1);
}
box.push(x);
if(pos.top()==x){
while(x--){
box.pop();
pos.pop();
f=1;
}
}
}
//cout<<i<<" "<<pos[i]<<endl;
cout<<box.size()<<endl;
}
return 0;
}