拖了将近一个礼拜才把题解写出来
最近实在是懒忙
cf难度1000-1500 链接:http://codeforces.com/gym/245430
A
题意:
定义MEX=不存在于数组中的最小非负整数
可进行n次操作,每次添加或移除一个元素。
解法:完全可以转换成 给定一目标数和一组数,求小于等于目标数,且不存在于数组中的数 的个数
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int n,x,counter=0;
bool a[101]={0};
int set1[101]={0};
cin >> n >> x;
for(int i=0;i<n;i++){
scanf("%d",&set1[i]);
a[set1[i]]=1;
}
for(int i=0;i<x;i++){
if(!a[i]){
counter++;
}
}
if(a[x])
counter++;
cout << counter;
//cout << "Hello world!" << endl;
return 0;
}
B
题意:
给定集合A,集合B,集合C=A∩B,和总人数N。已知Vasya自己没及格,问给定的集合ABC信息是否合理。
解法:
有以下几个点要判断
a+b-c >=n c>a c>b
#include <iostream>
using namespace std;
int acm()
{
int a,b,c,n;
cin >> a >> b >> c >> n;
if(a+b-c >= n||c>a||c>b){
return -1;
}
else
return n-(a+b-c);
//cout << "Hello world!" << endl;
}
int main()
{
cout << acm();
return 0;
}
c
题意:
给定两个盒子,第一个盒子有n1格,第二个盒子有n2格,给一堆数,问如何放置可使两盒的平均数之和最大。
解法:
从大到小开始装,然后优先装容量小的盒子。(因为求平均数sum/n中,n越小,平均值越大)
(这里边写了一半不想动脑了,就有了如下的if else)
#include <iostream>
#include <stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int n,n1,n2;
double c1=0,c2=0;
cin >> n >> n1 >> n2;
double a[100000]={0};
for(int i=0;i<n;i++){
scanf("%lf",&a[i]);
}
sort(a,a+n);
if(n1>n2){
for(int i=n-1;i>n-1-n2;i--){
c1+=a[i];
}
c1= c1/n2;
for(int i=n-1-n2;i>n-1-n2-n1;i--){
c2+=a[i];
}
c2 = c2/n1;
}
else{
for(int i=n-1;i>n-1-n1;i--){
c1+=a[i];
}
c1= c1/n1;
for(int i=n-1-n1;i>n-1-n1-n2;i--){
c2+=a[i];
}
c2 = c2/n2;
}
printf("%.8lf",c1+c2);
//cout << "Hello world!" << endl;
return 0;
}
D
题意:
这题可以看成数腿的问题。
鸡有两条腿,鸭子有三条腿(?),总共有7条腿,问笼中可能有鸡鸭各多少只。
解法:
如果存在ax+by=n,则输出任意一种情况。遍历就行
当然你们不要让我去找三条腿的鸭子啊
我找不出来的 ( 细软跑 )
#include <iostream>
using namespace std;
int main()
{
int n,a,b;
int i=0;
int ca=0,cb=0;
cin >> n >> a >> b;
if(n%a==0){
cout << "YES" << endl << n/a << " 0";
return 0;
}
else if(n%b==0){
cout << "YES" << endl << "0 " <<n/b;
return 0;
}
else{
for(i=0;n-a*i>0;i++){
if((n-a*i)%b==0){
cout << "YES" << endl << i << " " << (n-a*i)/b;
return 0;
}
}
cout << "NO";
return 0;
}
//cout << "Hello world!" << endl;
}
E
题意:
有n张技能牌。(假设无属性)
每张牌的级数上限都是100级,造成级数//10的伤害。( //是整除符号)
现在有k次升级机会
问牌组总攻击力最大能达到多少。
解法:
优先填补技能等级个位数大的技能
然后挨个升级到能达到的最大等级
如果全都满级了还有富余技能点,那也点不了技能了,只能当不存在。(当你氪金技能点买多的时候)
#include <iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b) {
return (a % 10) > (b % 10);
}
int main()
{
int n,k;
int temp=0,con=0;
int a[100001]={0};
cin >> n >> k;
for(int i=0;i<n;i++){
cin >> a[i];
}
sort(a,a + n,cmp);
for(int i = 0;i<n;i++){
if(k>0){
temp = min(10 - (a[i] % 10),k);
if(temp + a[i]<=100){
a[i] += temp;
k = k-temp;
}
}
}
temp=0;
for(int i = 0;i<n;i++){
if(a[i]<=100 && k>0){
temp=min(100 - a[i],k);
a[i]+= temp;
k-= temp;
}
}
for(int i = 0;i<n;i++){
con+= a[i]/10;
}
cout << con;
//cout << "Hello world!" << endl;
return 0;
}
剩下一道图论题。等我学习一下再来补吧