Welcome To Ke_scholar's Blog|

Ke_scholar

园龄:2年2个月粉丝:30关注:10

洛谷100题计划(10/100)

洛谷100题计划(10/100)

P1031 [NOIP2002 提高组] 均分纸牌 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

因为第\(1\)堆只能移动到第\(2\)堆,且第\(N\)堆只能移动到第\(N-1\)堆,所以直接从左边往右边转移就行,这里是都减了一个平均数,看所有堆都差多少,如果左右两个都没过平均数,可以看成先让右边的给点纸牌让左边达到平均数,然后左边欠的让右边去欠,这个过程右边给了左边一次所以要加上

#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
typedef pair<i64, i64> PII;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N;
cin >> N;
vector<i64> a(N);
i64 sum = 0;
for(auto &i : a) {
cin >> i;
sum += i;
}
sum /= N;
for(auto &i : a)
i -= sum;
int ans = 0;
for(int i = 0;i < N - 1;i ++){
if(a[i] != 0){
a[i + 1] += a[i];
ans ++;
}
}
cout << ans << '\n';
return 0;
}

P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

以前做过的直接上代码了(

反正\(n\)很小,直接暴搜了,\(m\)就是现在放了几个数,\(sum\)就是现在放了的数的和,\(st\)就是放第几个数(

#include<bits/stdc++.h>
using namespace std;
int a[20], n, k, ans;
int ss(int x)
{
if (x == 2) return 1;
for (int i = 2; i <= sqrt(x); i++)
if (x % i == 0) return 0;
return 1;
}
void dfs(int m, int sum, int st)
{
if (m == k)
{
if (ss(sum)) ans++; return ;
}
for (int i = st; i < n; i++)
dfs(m + 1, sum + a[i], i + 1);
return ;
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> a[i];
dfs(0, 0, 0);
cout << ans;
return 0;
}

P1060 [NOIP2006 普及组] 开心的金明 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

典型的\(01\)背包模版题

#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
typedef pair<i64, i64> PII;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> v(m), p(m);
for (int i = 0; i < m; i ++)
cin >> v[i] >> p[i];
vector<i64> dp(n + 1, 0);
for (int i = 0; i < m; i ++) {
for (int j = n; j >= v[i]; j--) {
dp[j] = max(dp[j], dp[j - v[i]] + v[i] * p[i]);
}
}
cout << dp[n] << '\n';
return 0;
}

P1100 高低位交换 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

先把\(n\)的前\(16\)位都取出来然后左移16位就得到了答案的前\(16\)位,然后直接将\(n\)右移\(16\)位就得到后\(16\)位了,最后加起来就行

#include<bits/stdc++.h>
using i64 = long long;
using namespace std;
typedef pair<i64, i64> PII;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n ;
i64 p = (n & 65535), q = (n >> 16);
p <<= 16;
cout << (p + q) << '\n';
return 0;
}

P1097 [NOIP2007 提高组] 统计数字 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

就是统计每个数字的出现次数以及排序,可以直接用map,map里的数会自动排序

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int main() {
int n,m;
cin >> n;
map<int,int> mp;
for(int i = 0 ;i < n;i ++){
cin >> m;
mp[m]++;
}
for(auto [x,y] : mp)
cout << x << ' ' << y << endl;
return 0;
}

本文作者:Ke_scholar

本文链接:https://www.cnblogs.com/Kescholar/p/17652342.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Ke_scholar  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起