目录
46届
先取完即输,最优方案就是取的越慢越好,每次只取 1 次,所以后面k1,k2给了没用
#include <iostream>
using namespace std;
int main()
{
int a,b;
cin>>a>>b;
if(a>b) cout<<"First";
else cout<<"Second";
return 0;
}
思路:
1.最多只能翻n-k张牌
2.总和sum=a1+a2+......+an
翻一张牌对于总和的改变就是的d [ i ] = b [ i ] - a [ i ]
因为要求总和最小,所以对于差值d [ i ]>=0则不选,选择d[ i ] < 0的情况
为了最小,则对差值进行排序,选前n-k个
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
int n,k;
int a[N],b[N],d[N];//d[N]用来存储差值
int main()
{
cin>>n>>k;
int sum=0;
for (int i = 1; i <= n; i ++ ) cin>>a[i],sum+=a[i];
for (int i = 1; i <= n; i ++ ) cin>>b[i],d[i]=b[i]-a[i];
sort(d+1,d+n+1);//对于差值排序
for(int i=1;i<=n-k;i++)//选前n个
if(d[i]>=0) break;
else sum+=d[i];
printf("%d\n",sum);
return 0;
}
写个贪心写法,中心思路都差不多,
贪心策略:每张牌变得越小越好,取c为变小幅度,即c越大越好
对sort重载的写法值得学习
写个贪心写法,中心思路都差不多,
贪心策略:每张牌变得越小越好,取c为变小幅度,即c越大越好
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n, k, ans;
struct node {
int a, b;
}q[200010];
bool cmp (node x, node y) {
return x.a - x.b > y.a - y.b;
}
int main() {
scanf ("%d%d", &n, &k);
for (int i = 1; i <= n; i ++ )
scanf ("%d", &q[i].a);
for (int i = 1; i <= n; i ++ )
scanf ("%d", &q[i].b);
sort(q + 1, q + n + 1, cmp);
k = n - k;
for (int i = 1; i <= n; i ++ ) {
if(q[i].b < q[i].a && k > 0) {
ans += q[i].b;
k --;
} else ans += q[i].a;
}
printf("%d", ans);
return 0;
}
以上借鉴了佬们的代码,就不自己打了
4398. 查询字符串
注意串的大小小于8,所以字串数量比较小,共36个,最后就36万个
这题好像不用字符串哈希,直接unordered map
所以开两个哈希表,一个存数量,一个存任意一个答案
看代码,直接暴力就可以
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
int main()
{
unordered_map<string,int> cnt;//数量
unordered_map<string,string> hash;//答案
int n,m;
cin>>n;
while (n -- )
{
unordered_set<string> S;//判重,因为字符串可能会重复
string str;
cin>>str;
for(int i=0;i<str.size();i++)
{
string s;
for(int j=i;j<str.size();j++)
{
s+=str[j];
S.insert(s);
}
}
for(auto&word:S)//枚举字串
{
cnt[word]++;
hash[word]=str;
}
}
cin>>m;//读入询问
while (m -- )
{
string str;
cin>>str;
cout<<cnt[str]<< ' ';//输初次数
if(hash.count(str)) cout<<hash[str]<<endl;//判断是否出现,若出现则输出包含这个字符串的子串
else cout<<'-'<<endl;
}
return 0;
}
————————————————
版权声明:本文为CSDN博主「不迷茫的小航」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62605130/article/details/124323729