A.Add Candies
题意:
有n个袋子装着糖果,最初第i个袋子装着i个糖果。你希望所有的袋子里都含有相同数量的糖果。执行m操作。在第j次操作中,你将取出一个袋子,并在除选中的袋子外的所有袋子中添加j个糖果。你的目标是找到一个有效的操作序列,使得所有的袋子将包含等量的糖果。
思路:
一道简单的构造题,通过规律可知对于n袋糖果,只需要操作n次,从第一袋操作到最后一袋即可。(例如三袋时,【1,2,3】,操作第一袋,【1,3,4】,操作第二袋,【3,3,6】,操作第三袋,【6,6,6】,符合题意)。
AC代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int b;
cin>>b;
cout<<b<<endl;
for(int i=1;i<=b;i++)
{
printf("%d ",i);
}
printf("\n");
}
return 0;
}
B.Numbers Box
题意:
给你一个n*m的矩阵,你可以使相邻两个元素的值同时乘以-1(改变符号),不限次数,问矩阵最大元素和是多少。
思路:
先计算非正数的个数,判断奇偶,如果是偶数,证明所有非正数都能翻过来,直接输出绝对值之和,如果是奇数,输出绝对值之和减去两倍的最小的绝对值
AC代码:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
using namespace std;
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int main()
{
int t;
cin>>t;
while(t--)
{
int sum=0;
int sum1=0;
int ans=0;
int maxx=10000;
int maps[15][15];
int num0=0;
int n,m;
int x1=0,y1=0;
cin>>n>>m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin>>maps[i][j];
maxx=min(abs(maps[i][j]),maxx);
if(maps[i][j]>0)
{
ans+=abs(maps[i][j]);
}
else
{
ans+=abs(maps[i][j]);
sum1++;
}
}
}
if(sum1%2!=0)
{
ans-=2*maxx;
}
cout<<ans<<endl;
}
return 0;
}
C.Knapsack
题意:
你有一个容量为w的背包,还有n件物品,第i件重量为wi。
把部分物品放入背包,其总重量大于w/2小于w,输出任意满足条件的重量总和
思路:
在输入的时候先过滤掉所有大于w的物品,将剩下的物品排序,从大到小便遍历,遇到大于w/2的可以直接输出,因为剩下的都小于w/2,所以可以从到小贪心直到总和大于w/2就可以输出。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <set>
#include <queue>
#include <stack>
#include <deque>
#include <map>
#include <ext/rope>
#include <algorithm>
using namespace std;
struct st
{
int num;
int val;
}st[200000+5];
int cmp(const struct st a,const struct st b)
{
return a.val>b.val;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int flag=0;
long long n,w;
int cnt=0;
scanf("%lld%lld",&n,&w);
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
if(t<=w)
{
st[++cnt].val=t;
st[cnt].num=i;
}
}
w++;
sort(st+1,st+cnt+1,cmp);
long long qw=0;
long long qq=0;
for(int i=1;i<=cnt;i++)
{
qq+=st[i].val;
if(qq>w/2)
break;
}
if(qq<w/2)
{
printf("-1\n");
continue;
}
int e[200002];
int cnt2=0;
for(int i=1;i<=cnt;i++)
{
if(1L*st[i].val>w/2)
{
e[i]=st[i].num;
cnt2=i;
break;
}
qw+=st[i].val;
e[i]=st[i].num;
if(qw>=w/2)
{
cnt2=i;
break;
}
}
printf("%d\n",cnt2);
for(int i=1;i<=cnt2;i++)
printf("%d ",e[i]);
printf("\n");
}
return 0;
}