A. Definite Game
题目链接:https://codeforces.com/contest/1081/problem/A
题意:
给出一个数v,然后让你可以重复多次减去一个数d,满足v%d!=0,问最后可以得到最小的是多少。
题解:
除开v=2输出2,其余直接输出1就行了= =/
代码如下:
#include <bits/stdc++.h> using namespace std; int main(){ int v; cin>>v; cout<<(v==2 ? 2 : 1); return 0; }
B. Farewell Party
题目链接:https://codeforces.com/contest/1081/problem/B
题意:
有n种颜色,每种颜色都有ai种颜色与之不同。现在要求输出bi,bi代表第i个颜色的种类。
如果没有合法的情况,则输出"Impossible"。
题解:
数据范围告诉我们应该用O(nlogn)的解法。
首先我们知道,对于第i个颜色,有ai种颜色与之不同,那么就有n-ai种颜色与之相同。
那么我们可以考虑排个序,算出每个位置的颜色有多少是应与之相同的,并计算出ai的个数cnt[ai]。
我们可以贪心地想把cnt[ai]分为cnt[ai]/(n-ai)种颜色,前提是能够除尽。不能除尽则代表没有可行方案。
最后直接输出就行了。这题是special judge。
代码如下:
#include <bits/stdc++.h> using namespace std; typedef long long ll ; const int N = 1e5+5; int b[N],cnt[N]; int n; struct node{ int v,pos; bool operator < (const node &A)const{ return v<A.v; } }a[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i].v); a[i].pos=i; } sort(a+1,a+n+1); int flag=0; a[0].v=-1;a[n+1].v=-1; for(int i=1;i<=n;i++){ int v = a[i].v; cnt[v]++; } for(int i=1;i<=n+1;i++){ if(a[i].v==a[i-1].v) continue ; int need=n-a[i].v; if(cnt[a[i].v]%need!=0){ flag=1;break; } } if(flag){ printf("Impossible"); }else{ int tot=0; for(int i=1;i<=n;i++){ int v=a[i].v; int need=n-a[i].v; if(cnt[v]%need==0) tot++; cnt[v]--; b[a[i].pos]=tot; } printf("Possible\n"); for(int i=1;i<=n;i++) printf("%d ",b[i]); } return 0; }
原文地址:https://www.cnblogs.com/heyuhhh/p/10134983.html
时间: 2024-10-07 08:33:18