H - 贪心
Crawling in process... Crawling failed Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
Description
Input
The input file contains several test cases, each of them as described below. The first line of the input contains the single integer number n<tex2html_verbatim_mark> ( 1n100 000<tex2html_verbatim_mark> ). The second line of the input contains n<tex2html_verbatim_mark> integer numbers -- ai<tex2html_verbatim_mark> ( 1aii<tex2html_verbatim_mark> ).Output
For each test case, the first line of the output must contain `` Yes'' if the trading session with specified volumes is possible and `` No'' otherwise. In the former option a second line must contain n<tex2html_verbatim_mark> numbers -- bi<tex2html_verbatim_mark> .Sample Input
4 1 2 3 3 4 1 2 3 4
Sample Output
No Yes 1 -1 -1 1
解题思路:
这个题目的题思就是输入n个数,判断这n个数是否能分成总和的一半并相等,我们可以定义一个类或者结构体数组存储,并定义两个成员x,y,x用来存放输入的数,y用来记录这个数的位置,因为之后我们要对
x进行排序,再定义一个整形数组,用来记录这个数乘-1还是1,最后要控制好循环条件,当所有数的和为奇数的时候,直接输出No,或者个数为1也直接输出No,否则输出Yes,并输出方案,即b数组
程序代码:
#include <cstdio> #include <algorithm> using namespace std; const int MAX=100010; long long sum; int n,i; int b[MAX]; struct node { int x,y; }a[MAX]; bool cmp(node a,node b) { return a.x>b.x; } bool init() { sum=0; for(int i=0;i<n;i++) { scanf("%d",&a[i].x); a[i].y=i; b[i]=-1; sum+=a[i].x; } if(sum%2) return true; else return false; } void solve() { sort(a,a+n,cmp); long long num=0; for( i=0;i<n;i++) { if(num+a[i].x<=sum/2) { num+=a[i].x; b[a[i].y]=1; if(num==sum/2) break; } } } void print() { for( i=0;i<n-1;i++) { printf("%d ",b[i]); } printf("%d\n",b[n-1]); } int main() { while( scanf("%d",&n)==1) { if(init()||n==1) printf("No\n"); else { printf("Yes\n"); solve(); print(); } } return 0; }
---恢复内容结束---
版权声明:此代码归属博主, 请务侵权!