首页 > 其他分享 >ACM日常训练日记——7.26

ACM日常训练日记——7.26

时间:2024-07-27 18:51:39浏览次数:5  
标签:int 7.26 cin long prefix ACM using 日记 dp

  • Atcoder训练
    1. Powerful Discount Tickets
      我们只需要动态维护使最大的值变小即可,这里我采用multiset去记录,有相同元素存在,也可以采用优先队列去维护
#include <bits/stdc++.h>

using namespace std;

using ll=long long;
ll n,m;
ll v[100010];
multiset<ll>st;
multiset<ll>::iterator ip;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>v[i],st.insert(v[i]);
	for(int i=1;i<=m;i++){
		ip = st.end();
		st.erase(--ip);
		st.insert(*ip/2);
	}
	ll ans=0;
	for(auto it=st.begin();it!=st.end();it++){
		ans+=*it;
	}
	cout<<ans;
}

2.Powerful Discount Tickets

  • 动态规划专项训练
    1.方块与收纳盒
    这道题很像走楼梯问题,是一个经典的线性dp,楼梯每次只能走一楼和二楼,所以dp[i]=dp[i-1]+dp[i-2]的方案数
    这里也一样
#include <bits/stdc++.h>

using namespace std;
long long dp[1001];
int main(){
    int n;
    cin>>n;
    dp[1]=1;
    dp[2]=2;
    for(int i=3;i<=80;i++)dp[i]=dp[i-1]+dp[i-2];
   while(n--){
       long long t;
       cin>>t;
       cout<<dp[t]<<'\n';
   }
}

2.舔狗舔到最后一无所有
dp[i]代表前i天有多少种方案,分两种情况:(把问题转化成i和i-1不同,i和i-2不同)
1、第i天的饭菜与第i-2天的饭菜不同,那么前i天有dp[i-2]x2种方案2、第i天的饭菜与第i-1天的饭菜不同,那么前i天有dp[i-1]x2种方案
因此前i天共计dp[i-1]*2+dp[i-2]x2,在这中包含都不同的情况

#include <bits/stdc++.h>
#define size 100100
const int MOD=1e9+7;
using namespace std;
long long dp[size],n,m;
int main(){
    dp[1]=3,dp[2]=9;
    for (int i=3;i<size;i++){
        dp[i]=(dp[i-1]*2%MOD+dp[i-2]*2%MOD)%MOD;
    }
    scanf("%lld",&m);
    while (m--){
        scanf("%lld",&n);
        printf("%lld\n",dp[n]);
    }
    system("pause");
    return 0;
}
  • Codeforcesz(Codeforces Round 962 (Div. 3))
    1.Left Right Operation
    送分题,如果能整除4,答案除4,不是的话加上1
#include <bits/stdc++.h>

using namespace std;

using ll=long long;

int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	while(n--){
		ll t;
		cin>>t;
		if(t<=4)cout<<1<<'\n';
		else{
			if(t%4==0)cout<<t/4<<'\n';
			else cout<<t/4+1<<'\n';
		}
	}
}

2. Scale
继续送分,画图,它的图是以k个为单位画的,每次画加k即可

#include <bits/stdc++.h>

using namespace std;

using ll=long long;
int main() {
	
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		int n, k;
		cin >> n >> k;
		vector<string> grid(n);
		for (int i = 0; i < n; ++i) {
			cin >> grid[i];
		}
		int reduced_n = n / k;
		vector<string> reduced_grid(reduced_n, string(reduced_n, '0'));

		for (int i = 0; i < reduced_n; ++i) {
			for (int j = 0; j < reduced_n; ++j) {
		
				int start_row = i * k;
				int start_col = j * k;
			
				reduced_grid[i][j] = grid[start_row][start_col];
			}
		}
		for (int i = 0; i < reduced_n; ++i) {
			cout << reduced_grid[i] << '\n';
		}
	}
	return 0;
}

3.Sort
用二维前缀和来记录两个区间的字母数量和类型,然后进行判断大小,返回差值即可

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

vector<vector<int>> preprocess(const string& s) {
	int n = s.size();
	vector<vector<int>> prefix(26, vector<int>(n + 1, 0));
	for (int i = 1; i <= n; ++i) {
		for (int j = 0; j < 26; ++j) {
			prefix[j][i] = prefix[j][i - 1];
		}
		prefix[s[i - 1] - 'a'][i]++;
	}
	return prefix;
}

int mi(const vector<vector<int>>& prefix_a, const vector<vector<int>>& prefix_b, int l, int r) {
	int ans = 0;
	for (int i = 0; i < 26; ++i) {
		int ca = prefix_a[i][r] - prefix_a[i][l - 1];
		int cb = prefix_b[i][r] - prefix_b[i][l - 1]; // 修正这里的错误
		if (ca > cb) {
			ans += (ca - cb);
		}
	}
	return ans;
}

int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while (t--) {
		int n, q;
		cin >> n >> q;
		string a, b;
		cin >> a >> b;
		
		vector<vector<int>> prefix_a = preprocess(a);
		vector<vector<int>> prefix_b = preprocess(b);
		
		for (int i = 0; i < q; ++i) {
			int l, r;
			cin >> l >> r;
			cout << mi(prefix_a, prefix_b, l, r) << '\n';
		}
	}
	return 0;
}

4.Fun
暴力加上减枝即可

#include <bits/stdc++.h>

using namespace std;

long long c(long long n, long long x) {
	long long count = 0;
	for (long long a = 1; a < x - 1; ++a) {
		for (long long b = 1; b < x - a; ++b) {
			long long ab = a * b;
			 if (ab >= n) break; // 如果 ab 已经大于等于 n,则不需要继续计算
			long long c1 = (a + b > 0) ? (n - ab) / (a + b) : 0;
			long long c2 = x - a - b;
			long long c_max = min(c1, c2);
			if (c_max > 0) {
				count += c_max;
			}
		}
	}
	return count;
}

int main() {
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int t;
	cin >> t;
	vector<long long> results;
	
	for (int i = 0; i < t; ++i) {
		long long n, x;
		cin >> n >> x;
		results.push_back(c(n, x));
	}
	
	for (long long result : results) {
		cout << result << '\n';
	}
	
	return 0;
}

标签:int,7.26,cin,long,prefix,ACM,using,日记,dp
From: https://www.cnblogs.com/dontian/p/18325412

相关文章

  • 7.26 Dp 主题赛 赛后总结
    T1T1看上去就很板,开场后有几个人一直在说话导致我心烦意乱,加上Sorato和Psm很快就切掉,可我确一直没有思路,所以开始的时候很慌。后来冷静下来仔细思考一下,首先注意到数据范围允许\(O(n^2)\)的dp,不难想到设置一个这样的dp状态,\(f[i]\)表示将区间\([1,i]\)变成美丽的所需的最小花......
  • 2024.7.26总结
    今天学习一些基本DP线性DP区间DP状压DP树形DP数位DP不好定转移顺序就用记忆化搜索。线性DP一般定义形如\(dp_{i,s}\)的状态,表示考虑了前\(i\)个,限制为\(s\)的最优解。视情况可以把\(i\)压掉,或者把\(s\)在枚举中体现以此压掉。区间DP是从小区间合并到大区间,注意转移顺序,......
  • 7.26每日一练
    1.学生管理系统(增删改查)#include<stdio.h>#include<string.h>intmain(intargc,constchar*argv[]){ intnum=0; inta=0,b=0,c=0; inti,j; intm,n; charadd1[30],add2[30],add3[30]; ints,sub,x,y; charmod[30]; intex; intlen1,len2,len3;......
  • 学习Java的第十一天啦(2024.7.26)
    1.死锁的条件:死锁的产生还涉及到一些具体的条件,这些条件可以被看作是死锁产生的必要条件,包括:1.互斥条件:资源不能被多个进程或线程同时访问,即资源是互斥的。2.请求保持条件:进程或线程在请求资源时,已经持有其他资源,并且不愿意释放已经持有的资源。3.不可剥夺条件:已经分配给进......
  • 2024年暑假ACM集训第1场
    A:小青蛙跳台阶题目描述想必你应该做过这么一道题:一只小青蛙一次可以跳1级台阶,也可以一次跳2级台阶。求该青蛙跳上第N级台阶总共有多少种跳法?(假设小青蛙的初始位置是第0级台阶)现在小青蛙遇到了一点麻烦,因为其中有一级台阶是坏的,小青蛙不能跳到这一级。假设坏掉的这一级台阶......
  • 7.26课后作业
    课堂笔记整理思维导图二、使用fgets统计给定文件的行号intmain(intargc,constchar*argv[]){ intcount=0; FILE*file=fopen("./text.txt","r"); charbuf[20]=""; char*data=fgets(buf,sizeof(buf),file); while(data!=NULL){ intindex=strlen(data......
  • 学习日记-24/7/26
    对QT控件使用差很多,不全面。不太会看文档,自己对于新方法无法适应。内存泄漏的现象,如何检查代码中的内存泄露?已分配的内存空间在使用完毕后未被释放,导致可用内存减少并最终可能导致系统性能下降或程序崩溃。方法一:代码审查和静态分析工具(自己查)方法二:动态分析工具(Valgrind)......
  • c语言(7.26)
    今天学习了二级指针和多级指针,数组指针数组指针#include<stdio.h>intmain(){ //利用指针遍历数组 intarr[]={10,20,30,40,50}; intlen=sizeof(arr)/sizeof(int); //获取数组的指针 //1获取数组的首地址 int*p1=arr; //2循环 for(inti=0;i<len......
  • 近期题解(2024.7.26)
    CF1070AFindaNumber一个朴素的想法是设\(dp_{x,y}\)表示模\(d\)为\(x\)且和为\(y\)的最小值,那么答案就是\(dp_{0,s}\)。自然初始状态为\(dp_{0,0}=0\),但是我们发现这个转移关系是带环的,所以说要把这个dp换成最短路。直接从\((0,0)\)为源跑一遍bfs即可,时间复......
  • 【提交ACM出版 | EI&Scopus检索稳定 | 高录用】2024年数字经济,区块链与人工智能国际学
    2024年数字经济,区块链与人工智能国际学术会议(DEBAI2024)为第五届大数据与社会科学国际学术会议(ICBDSS2024)的分会,将于2024年8月23-25日在中国-广州隆重举行。为了让更多的学者有机会参与会议分享交流经验。本次会议主要围绕“数字经济,区块链与人工智能等研究领域展开讨论......