记录一下自己的丑代码。D题还不会,看别人代码也不懂,虽然就十来行。。日后再补
A:http://codeforces.com/contest/1042/problem/A
/*
* @Author: SamsonHo
* @Date: 2018-09-17-16.04.25
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
int a[105];
int main(void)
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
for(int i = 1; i <= n; ++i)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int Max = a[n]+m;
int pos = 1;
for(int i = 1; i < n; ++i)
{
if(a[n] == a[i]) break;
if(m > a[n]-a[i])
{
m -= a[n]-a[i];
a[i] = a[n];
}
else
{
a[i] += m;
m = 0;
break;
}
}
if(m)
{
printf("%d %d\n",a[1]+m/n+(m%n!=0), Max);
}
else
{
printf("%d %d\n",a[n], Max);
}
}
}
B:http://codeforces.com/contest/1042/problem/B
B的代码就更丑了,当时没想到怎么做,只能暴力敲一下了。
/*
* @Author: SamsonHo
* @Date: 2018-09-17-16.25.55
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 1e5+10;
//struct juice
//{
// int v,a,b,c;
//}ju[1005];
//bool cmp(juice x,juice y)
//{
// return x.v < y.v;
//}
int a[11],v;
//a b c ab ac bc abc;
//1 3 5 4 6 8 9
int main(void)
{
int n;
char str[5];
while(~scanf("%d",&n))
{
for(int i = 0; i < 10; ++i)
a[i] = 300005;
int tmp;
for(int i = 1; i <= n; ++i)
{
scanf("%d%s",&v,str);
tmp = 0;
for(int j = 0; str[j]; ++j)
{
if(str[j] == 'A')
tmp += 1;
else if(str[j] == 'B')
tmp += 3;
else if(str[j] == 'C')
tmp += 5;
}
if(v < a[tmp])
a[tmp] = v;
}
int ans = 300005;
ans = min(ans,a[1]+a[3]+a[5]);
ans = min(ans,a[4]+a[5]);
ans = min(ans,a[6]+a[3]);
ans = min(ans,a[8]+a[1]);
ans = min(ans,a[9]);
ans = min(ans,a[4]+a[6]);
ans = min(ans,a[4]+a[8]);
ans = min(ans,a[6]+a[8]);
if(ans == 300005)
puts("-1");
else
printf("%d\n",ans);
}
}
C:http://codeforces.com/contest/1042/problem/C
C的话也是模拟做了一下,想到正数的话就直接乘就好了,但是要优先处理负数,两个负数相乘可以变正数,所以偶数个就直接两两相乘就消化掉了,奇数个的情况下如果有0存在,可以和0相乘就消去一个值最大的负数,剩下的还是两两相乘。第二步再处理0,一直进行操作1到只剩一个。再把剩下的那个2操作消灭掉。但是还有个情况就是0 0 0 这样的,最后剩的那个0不能消掉。
啊,情况好多,这种办法赛场上要不是没思路真的不想碰运气……
/*
* @Author: SamsonHo
* @Date: 2018-09-17-16.47.41
* @URL:
*/
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 2e5+10;
vector<int> zero;
vector<int> z;
vector<int> f;
int a[MAXN],s0;
bool cmp(int x,int b)
{
return a[x] > a[b];
}
void dealzero()
{
}
int main(void)
{
int n;
while(~scanf("%d",&n))
{
zero.clear();
z.clear();
f.clear();
int cnt = 0;
for(int i = 1; i <= n; ++i)
{
scanf("%d",&a[i]);
if(a[i] == 0)
zero.push_back(i);
else if(a[i] > 0)
z.push_back(i);
else
f.push_back(i);
}
s0 = zero.size();
int sf = f.size();
int ff = 0;
if(sf % 2 == 1)
{
ff = 1;
sort(f.begin(),f.end(),cmp);
if(s0 > 0)
printf("1 %d %d\n",f[0],zero[0]);
else
printf("2 %d\n",f[0]);
for(int i = ff+1; i < sf; ++i)
{
printf("1 %d %d\n",f[i],f[ff]);
}
--sf;
}
else if(sf % 2 == 0)
{
for(int i = 1; i < sf; ++i)
{
printf("1 %d %d\n",f[i],f[0]);
}
}
if(s0 >= 1)
{
int len = zero.size();
for(int i = 1; i < len; i++)
printf("1 %d %d\n",zero[i],zero[0]);
}
int sz = z.size();
for(int i = 1; i < sz; ++i)
{
printf("1 %d %d\n",z[i],z[0]);
}
if(sf && sz)
printf("1 %d %d\n",f[ff],z[0]);
if((sf || sz) && s0)
printf("2 %d\n",zero[0]);
}
}
D:http://codeforces.com/contest/1042/problem/D
待补