Educational Codeforces Round 96 (Rated for Div. 2)
A. Number of Apartments
暴力
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int sum;
int flag = 0;
int i,j,k;
for(i=0; i<=n; i+=7){
for(j=0; i+j<=n; j+=5){
for(k=0; i+j+k<=n; k+=3){
if(i+j+k==n){
flag = 1;
break;
}
}
if(flag)
break;
}
if(flag)
break;
}
if(flag==1){
cout<<k/3<<' '<<j/5<<' '<<i/7<<endl;
}
else
cout<<"-1"<<endl;
}
return 0;
}
B - Barrels
排序后用k次操作从大到小,给最大的桶倒水
#include<iostream>
#include<algorithm>
using namespace std;
long long a[200005];
int main()
{
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
for(int i=0; i<n; ++i){
cin>>a[i];
}
sort(a,a+n);
for(int i=0; i<k; ++i){
a[n-1] += a[n-2-i];
a[n-2-i] = 0;
}
cout<<a[n-1]<<endl;
}
return 0;
}
C - Numbers on Whiteboard
rounded up 向上取整
In one operation you can erase any two numbers a and b from the board and write one integer
a
+
b
2
\frac {a+b} {2}
2a+b rounded up instead.
我们需要求最小,应从最后面开始,n和n-1结合向上取整为n,n再和n-2结合为n-1,n-1和n-3结合为n-2,n-2和n-4结合为n-3,…依次可得,最后一定能变成 2
显然这道题需要我们构造出一种万能的方案,使得每次剩下的数字为 ,这样才能得到最小。
我们不妨贪心考虑,如果每次都向上取整,那么答案有可能会因此增大。所以向上取整的数量要尽可能少,即奇偶性不同的合并要尽可能少。
另外考虑到平均数的性质,越大的数越应该先合并,这样答案才能最优。
综合上面的思考,我们不难构造出一种方案
1
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<"2"<<endl;
cout<<n<<' '<<n-1<<endl;
for(int i=n; i>2; --i){
cout<<i<<' '<<i-2<<endl;
}
}
return 0;
}