//今日代码
2016-07-26 training
A. Queue on Bus Stop
(有n群人排队坐车,车的最多载客数为m,每群人要一起上车,坐不下的话一起等下一趟车。做法是把上车人数加一下,加到不能加则清空,ans++)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
int arr[110];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n,m;
int sum= 0;
cin >> n >> m;
for(int i = 0; i < n ; i++)
cin >> arr[i];
int ans = 1;
for(int i = 0; i <n ; i++ )
{
if(sum+arr[i] <= m) sum+=arr[i];
else
{
sum = arr[i];
ans++;
}
}
cout << ans << endl;
return 0;
}
B. Pasha Maximizes
(一个没有前导零的数,每次交换两个相邻位置上的数字,最多交换k次,问能构成的最大数。做法是贪心,用字符串读入这个大数之后,从最高位开始,对于每个位置上的数判断一下再此之后的k个是否有比它大的,若有,找到最大的那个,然后把这个位置的数一直交换到该位上。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
string s;
int k;
cin >> s >> k;
for(int i = 0; i <s.length(); i++)
{
int t = i;
for(int j = i+1; j < s.length() && j-i <=k; j++)
if(s[j] > s[t]) t= j;
k-=(t-i);
while(t!=i)
{
swap(s[t],s[t-1]);
t--;
}
}
cout << s << endl;
return 0;
}
C. Cardiogram
(画出一组n个的ai条线段符号构成的心电图。构造一个字符型的空表,读入的 i 个若是奇数则为下降符号\,若为偶数为上升符号/,从开出的数组中间最左开始起画,每次把一整条画完之后更新一下新的最高点up和最低点down,为方便输出。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
char arr[2020][1010];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n;
cin >> n;
int r = 1002;
int c = 0;
int up = r,down = r;
memset(arr,' ',sizeof(arr));
for(int i =0; i < n; i++)
{
int t;
cin >> t;
for(int j = 0; j < t; j++)
{
if(i%2)
{
arr[r][c] = '\\'; //转义字符
r++;
}
else
{
arr[r][c] = '/';
r--;
}
c++;
}
if(i%2) r--;
else r++;
if(up > r) up = r;
if(down < r) down = r;
}
for(int i = up; i <= down; i++)
{
for(int j = 0; j < c; j++)
cout << arr[i][j];
cout << endl;
}
return 0;
}
F. Devu, the Singer and Churu, the Joker
(在给定的表演时间内,歌手要唱完所有曲目,歌曲间歇10分钟。讲笑话5分钟,问最多能讲多少笑话。表演时间减去歌手时间和间歇时间,若小于零则-1,否则扣除歌手时间除5即为答案。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
int arr[110];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int sum = 0;
int n,d;
cin >> n >> d;
for(int i = 0; i < n; i++)
{
cin >> arr[i];
sum+=arr[i];
}
int ans = (n-1)*2;
d = d-ans*5-sum;
if(d < 0)
{
cout << "-1"<< endl;
return 0;
}
ans+=d/5;
cout << ans << endl;
return 0;
}
G. Devu, the Dumb Guy
(有n门科目,每门科目有一定章节数,学一个章节要花x小时,学下一门科目的时候时间减为x-1,直到减为1。问要学完全部科目的最少时间。显然章节数少的应当先学,所以sort一下对于n门科目每次加上时间乘以章节数就好。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
LL arr[100010];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n,x;
cin >> n >> x;
for(int i = 0; i < n; i++)
cin >> arr[i];
sort(arr,arr+n);
LL ans = 0;
for(int i = 0; i < n; i++)
{
ans+=arr[i]*x;
if(x>1) x-=1;
}
cout << ans << endl;
return 0;
}
H. Devu and Partitioning of the Array
(有n个数要分成k堆,其中和为偶数的要为p堆。奇+奇=偶,偶+偶=偶,奇+偶=奇。奇数构成的可能性更小先考虑奇数。要满足偶数有p堆也就是奇数有k-p堆,如果这些数中奇数个数不满足k-p 或 除去k-p多出的奇数不是偶数个 或 偶数个数加上扣掉k-p的奇数个数除2不足p 都无法满足条件(:зゝ∠)。那么排除这种情况一定能满足条件。首先看p=k或p=0的情况,由于能满足条件,那么每个堆放一个偶数或奇数,其余全部堆在剩下一堆即可(由于偶数可能由奇数构成,所以在满足条件的情况下偶数可能不够多,这时候用两个奇数填就好)。如果不是这种特殊情况,每堆先按照上面那样填,最后剩一个偶数堆和一个奇数堆待填,只要把一个奇数放在奇数堆,剩余全部丢在偶数堆即可。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
int a[100010];
int b[100010];
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n, p, k;
int odd = 0, even = 0;
cin >> n >> k >>p ;
for(int i = 0; i < n; i++)
{
int num;
cin >> num;
if(num%2 == 1) a[odd++] = num;
else b[even++] = num;
}
if(odd < k-p || (odd - k + p) % 2 == 1 || even + (odd - k + p) / 2 < p)
cout <<"NO"<< endl;
else
{
cout <<"YES"<< endl;
for(int i = 0; i < k-p-1; i++)
cout <<"1 "<<a[--odd]<< endl;
for(int i = 0; i < p - 1; i++)
{
if(even)
cout <<"1 "<< b[--even]<< endl;
else
{
cout <<"2 "<< a[odd-1]<<" "<<a[odd-2] << endl;
odd -= 2;
}
}
if(k-p && p)
cout <<"1 "<< a[--odd] << endl;
cout << odd+even;
while(odd) cout <<" "<< a[--odd];
while(even) cout <<" "<< b[--even];
cout <<endl;
}
return 0;
}
I. Devu and his Brother
(a,b两个队列,要使得a队列中的最小值不小于b队列中的最大值,对于每次操作可以对任意一个队列的任意一个数加1或减1,问最小操作次数。能想到的两种操作不外乎把a中数值小的一直加,或把b中数值大的一直减。做法是把a按从小到大排,b按从大到小排,显然要改变的是较小个数的队列中的数,把前min(n,m)个对应的ab队列上的数做差相加即可。)
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<map>
#define LL long long
#define INF 0x1f1f1f1f
using namespace std;
LL a[100010];
LL b[100010];
bool compare(int x, int y)
{
return x>y;
}
int main()
{
freopen("xx.in","r",stdin);
freopen("xx.out","w",stdout);
int n,m;
cin >> n >> m;
for(int i = 0; i <n; i++)
cin >> a[i];
for(int i = 0; i < m; i++)
cin >> b[i];
sort(a,a+n);
sort(b,b+m,compare);
n = min(n,m);
LL ans = 0;
for(int i = 0; i < n; i++)
if(b[i]>a[i]) ans+=(b[i]-a[i]);
cout << ans << endl;
return 0;
}
本文精选了多道算法题目并提供了解题思路与代码实现,包括队列问题、数位操作、图形绘制、时间安排等典型场景,通过实例帮助读者理解和掌握相关算法技巧。
2647

被折叠的 条评论
为什么被折叠?



