题目链接:http://codeforces.com/contest/433
解题报告:
A - Kitahara Haruki's Gift
水题,能选200先选200,不行再选100,正好能到一半就赢了。
#include
#include
#include
#include
using namespace std;
int arr[120];
int main()
{
int n,i,sum=0,no1=0,no2=0;
cin>>n;
for(i=0;i>arr[i];
sum += arr[i];
if(arr[i] == 100) no1++;
else no2++;
}
int aim=sum/2;
bool ans=false;
int temp=0;
sort(arr,arr+n);
while(1)
{
if(temp == aim) {ans=true;break;}
if(temp < aim && temp+200 <= aim && no2)
{
temp += 200; no2--;
}
else if(temp < aim && temp+100 <= aim && no1)
{
temp += 100; no1--;
}
else break;
}
if(ans)
cout<<"YES"<
B - Kuriyama Mirai's Stones
水题,,比第一题还水,区间和预处理不解释
#include
#include
#include
#include
typedef long long ll;
using namespace std;
const int maxn = 1e5+50;
ll arr[maxn],sum[maxn],res[maxn];
int main()
{
//freopen("input.txt","r",stdin);
memset(arr,0,sizeof(arr));
memset(sum,0,sizeof(sum));
memset(res,0,sizeof(res));
int n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>arr[i];
for(i=1;i<=n;i++)
sum[i]=sum[i-1]+arr[i];
sort(arr+1,arr+n+1);
for(i=1;i<=n;i++)
res[i]=res[i-1]+arr[i];
int noq,t,l,r;
cin>>noq;
while(noq--)
{
cin>>t>>l>>r;
if(t==1)
cout<<(sum[r] - sum[l-1])<
C - Ryouko's Memory Note
这题没做出来,看了CLJ的代码。才一下子想起来之前看过的一句话,这题的关键就一句话:
数轴上到各点距离之和最小的点是它们的中位数点!
然后枚举那正确的复杂度应该是 o( n*near[ i ] ) 那么大(写法不标准别在意),别脑残什么的写复杂了,然后即可AC
对了,不得不说,CLJ用 vector 之类的东西确实比我这种渣渣熟练多了,我很少用的
///数轴上到各个点距离之和最小的点是它们的中位数点!!
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 1e5+50;
ll arr[maxn];
vector near[maxn];
int main()
{
freopen("input.txt","r",stdin);
int n,m,i,j;
cin>>n>>m;
ll ans=0;
for(i=0;i>arr[i];
if(i>=1 && arr[i-1]!=arr[i])
{
near[arr[i]].push_back(arr[i-1]);
near[arr[i-1]].push_back(arr[i]);
ans += abs(arr[i-1]-arr[i]);
}
}
ll sum=ans;
for(i=1;i<=n;i++)
{
if(near[i].empty()) continue;
vector temp = near[i];
sort(temp.begin(),temp.end());
int mid = temp[temp.size() / 2];
ll tans=0,preans=0;
for(j=0;j