首页 > 其他分享 >Acwing第 131 场周赛 之找最值过程中维护某个性质的方案

Acwing第 131 场周赛 之找最值过程中维护某个性质的方案

时间:2023-11-30 12:44:23浏览次数:42  
标签:周赛 int 最大值 枚举 long 131 https 最值 define

https://www.acwing.com/problem/content/5367/
题目如果只需要输出最大值,我都没有问题。每次需要输出方案的时候,我似乎都需要先统计最大值,再重新扫描一遍找所有能够取得最大值的方案,然后在这些方案中找到最大值。最好的做法应该是在找最大值的过程中就维护题目要求方案的排序关键字,有时候这个关键字不是我们枚举顺序能决定的,我们就需要单独处理。

// Problem: 奶牛报数
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/5367/
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define ull unsigned long long
#define pii pair<int,int>
#define double long double
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl  "\n"

const int N = 2e5 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
int a[N];

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n+1;i<=2*n;i++)a[i]=a[i-n];
	int l,r;cin>>l>>r;
	//int len=r-1-l+1;
	//枚举哪个位置牛报1号
	for(int i=1;i<=2*n;i++)a[i]+=a[i-1];
	//for(int i=1;i<=2*n;i++)cerr<<a[i]<<" ";
	//cerr<<endl;
	int mx=0,pos=1;
	for(int i=1;i<=n;i++){
		int tmp=a[i+r-1-1]-a[i+l-2];
		//cerr<<mx<<endl;
		if(mx<tmp){
			mx=tmp;
			pos=i;
		}
		
		
		
	}
	int ans=mx;
	int res=1e9;
	//vector<int>v;
	for(int i=1;i<=n;i++){
		int tmp=a[i+r-1-1]-a[i+l-2];
		if(tmp==mx)res=min(res,n+2-i);
		}
	if(res>n)res-=n;
	cout<<res<<endl;
}
signed main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);

    int t;
   t=1;

    while (t--) {
solve();
    }
    return 0;
}

上面是实现比较繁琐的代码。
下面给出 边求最大值 边维护题目要求关键字 的方案 的代码

// Problem: 奶牛报数
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/5367/
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
#define ull unsigned long long
#define pii pair<int,int>
#define double long double
#define baoliu(x, y) cout << fixed << setprecision(y) << x
#define endl  "\n"

const int N = 2e5 + 10;
const int M = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
const double eps = 1e-8;
int n, m;
int a[N];
int get(int pos){
	int res=n+2-pos;
	if(res>n)res-=n;
	return res;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=n+1;i<=2*n;i++)a[i]=a[i-n];
	int l,r;cin>>l>>r;
	//int len=r-1-l+1;
	//枚举哪个位置牛报1号
	for(int i=1;i<=2*n;i++)a[i]+=a[i-1];
	//for(int i=1;i<=2*n;i++)cerr<<a[i]<<" ";
	//cerr<<endl;
	int mx=-1,pos=1e9;
	for(int i=1;i<=n;i++){
		int tmp=a[i+r-1-1]-a[i+l-2];
		//cerr<<mx<<endl;
		if(mx<tmp||(mx==tmp&&get(i)<get(pos))){
			mx=tmp;
			pos=i;
		}
		
		
		
	}
	// int ans=mx;
	// int res=1e9;
	//vector<int>v;
	// for(int i=1;i<=n;i++){
		// int tmp=a[i+r-1-1]-a[i+l-2];
		// if(tmp==mx)res=min(res,n+2-i);
		// }
	// if(res>n)res-=n;
	cout<<get(pos)<<endl;
}
signed main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(false);

    int t;
   t=1;

    while (t--) {
solve();
    }
    return 0;
}

这道题目维护的get(i),也就是所有方案中get(i)的最小值,所以在比较最大值相等的过程中只需要在比较一下get(i)。
那我们为什么不直接从小到大枚举这个关键字呢,虽然只需要找到一个反函数映射回去,但是正着枚举思路实现思路更自然清晰。

标签:周赛,int,最大值,枚举,long,131,https,最值,define
From: https://www.cnblogs.com/mathiter/p/17867053.html

相关文章

  • 2023-2024 20231313《计算机基础与程序设计》第十周学习总结
    2023-202420231313《计算机基础与程序设计》第十周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第十周学习总结作业内容计算机科学概论第12,13,14章《C语言程序设计》第9章并完成云班课测试,信息系统、数据库与SQL、人工智能与专家系统、人工......
  • 2023-2024-1 学号20231318《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第九周作业这个作业的目标自学教材《计算机科学概论》第10、11章以及《C语言程序设计》第8章并完成云班课测试。作业正文2023-2024-1学号202......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第九周学习总结
    作业信息这个作业属于哪个课程<班级的链接>2023-2024-1-计算机基础与程序设计|-这个作业要求在哪里<作业要求链接>2023-2024-1计算机基础与程序设计第6周作业|这个作业的目标《计算机基础概论》第10、11章《C语言程序设计》第8章|作业正文作业链接教材......
  • Leetcode 373周赛
    周赛链接:https://leetcode.cn/contest/weekly-contest-373/100139.循环移位后的矩阵相似检查不需要判断奇数还是偶数,题目要求最后两个矩阵是否相同,那么向左循环移动和向右循环移动意义是一样的奇数行右移k次,$$a[i]==a[(i+k)%size]$$偶数行左移k次,$$a[i]==a[(i-k)%......
  • 2023-2024-1 20231310《计算机基础与程序设计》第9周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里[2022-2023-1计算机基础与程序设计第九周作业]https://www.cnblogs.com/rocedu/p/9577842.html#WEEK03这个作业的目标学习C语言程序设计第九章并完成云班课测试,《C语言程序设计......
  • 牛客周赛Round20. C 小红的01串构造 (纯构造
    packagenewCode.周赛Round20;importjava.util.Scanner;publicclassC{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt(),k=sc.nextInt(),t=sc.nextInt();if(t>=k||2......
  • 牛客周赛Round20. A 赝品
    packagenewCode.周赛Round20;importjava.util.Arrays;importjava.util.Scanner;publicclassA{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();int[]a=newint[n+10];......
  • 20211316郭佳昊 《信息安全系统设计与实现(上)》 第十一周学习总结 第十三章TCP/IP和网
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学****知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • Linux命令(131)之groupmod
    linux命令之groupmod1.groupmod介绍linux命令groupmod是用来修改组属性2.groupmod用法groupmod[参数]GroupNamegroupmod参数参数说明-n修改组名-g新的GID3.实例3.1.创建用户组命令:groupaddztj[root@rhel77~]#groupaddztj[root@rhel77~]#cat/etc/group|grepztjztj:x:......
  • 2023-2024-1-20231317计算机基础与程序设计学习第九周总结
    作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第九周作业)这个作业的目标<《计算机科学概论第10,11章》《C语言程序设计第8章》>作业正文https://www.cn......