https://vjudge.net/contest/374571
A - Rounding CodeForces - 898A
水水水
//#include//poj,hdu can't use it
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9;
using namespace std;
/***********************defination************************/
int main()
{
int a;
cin>>a;
if(a%10==0)cout<<a<<endl;
else{
int temp = a % 10;
if(temp >= 5)
{
temp = 10 - temp;
a += temp;
cout<<a<<endl;
}
else
{
a -= temp;
cout<<a<<endl;
}
}
return 0;
}
B - Proper Nutrition CodeForces - 898B
水水水
//#include//poj,hdu can't use it
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 1e9;
using namespace std;
/***********************defination************************/
int main()
{
int a,b,c;
cin>>a>>b>>c;
bool flag=false;
for(int i=0;i<=a/b;i++){
int x=a-b*i;
if(x%c==0){
cout<<"YES"<<endl;
printf("%d %d\n",i,x/c);
flag=true;
break;
}
}
if(!flag) printf("NO\n");
return 0;
}
C - Phone Numbers CodeForces - 898C
题目意思为,给一个人名以及N个电话号码,假如说一个电话号为另一个的后缀(比如12和612)则去掉12.
思路为字典序的倒序插入,DFS到一个结点,假如他没有任何后续的节点的话则表明他不是任何电话号的后缀。
思路没问题但是代码有点BUG,晚点补。
D - Alarm Clock CodeForces - 898
n个闹钟,如果在m的连续时间内有k个闹钟响了,则会被吵醒。问最小关掉多少个闹钟不会被吵醒。
贪心题,每次找到m个时间内可能会让他醒的最后一个闹钟关掉即可。
//#include//poj,hdu can't use it
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int a[maxn],b[maxn],n,m,k;
int main(){
cin>>n>>m>>k;
for(int i = 0; i < n; i ++) scanf("%d",&a[i]);
sort(a,a+n);
int ans = 0;
for(int i = 0, j = 0; i < n; i ++){
b[j] = a[i];
if(i < k-1 || b[j] - b[j-k+1] >= m) j ++;
else ans ++;
}
printf("%d\n",ans);
return 0;
}
E
给定N个数,每次可以对任一一个数加一或者减一(数要大于等于零),问最少多少次操作可以让一半的数为平方数,另外一半不为平方数。
贪心题。样例比较友好,直接给了6个0并且操作次数为6,是一个提示。也就是0变成一个非平方数的最小操作数为2次,其他任意一个数变为非平方数的最小操作必为1次。而非平方数转换为平方数的操作次数只要找到向下的平方数和向上平方数的最小距离即可。
//#include//poj,hdu can't use it
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
/************************head file************************/
#define inf 0x3f3f3f3f
#define SI(x) scanf("%d",&x)
#define set0(x) memset(x,0,sizeof(x))
#define ms(x,n) memset(x,n,sizeof(x));
typedef long long ll;
const int mod = 998244353;
const int maxn = 2e5;
using namespace std;
/***********************defination************************/
int a[200010];
bool cmp(int a,int b)
{
return a>b;
}
int main(){
priority_queue<int,vector<int>,greater<int> >p1,p2;
ll ans = 0;
int n;
cin>>n;
for(int i = 0;i < n;i++)
{
int temp;
cin>>temp;
int sq = sqrt(temp);
if(sq*sq == temp)
if(temp == 0)p1.push(2);
else p1.push(1);
else p2.push(min((sq+1)*(sq+1)-temp,temp-sq*sq));
}
//sort(a,a+n);
//for(int i = 0;i < n;i++)cout<
while(p1.size()>n/2){
ans+=p1.top();
p1.pop();
}
while(p2.size()>n/2){
ans+=p2.top();
p2.pop();
}
cout<<ans<<endl;
return 0;
}
F - Restoring the Expression CodeForces - 898F
代补
在这里插入代码片